2009-02-09 42 views
7

Bị đập đầu của tôi chống lại điều này tất cả các buổi sáng.WPF: Vô hiệu hóa ListBox, nhưng cho phép di chuyển

Về cơ bản, tôi có một hộp danh sách và tôi muốn ngăn mọi người thay đổi lựa chọn trong quá trình chạy dài nhưng cho phép họ vẫn cuộn.

Giải pháp:

Tất cả các câu trả lời đều tốt, tôi đã nuốt các sự kiện chuột vì đó là điều dễ hiểu nhất. Tôi có dây PreviewMouseDown và PreviewMouseUp đến một sự kiện duy nhất, kiểm tra backgroundWorker.IsBusy của tôi, và nếu nó đã được thiết lập các tài sản IsHandled trên sự kiện args để đúng sự thật.

Trả lời

1

Bí quyết là không thực sự vô hiệu hóa. Vô hiệu hóa sẽ khóa tất cả các tin nhắn từ hộp cuộn.

Trong suốt quá trình hoạt động dài, hãy tô xám văn bản trong hộp danh sách bằng thuộc tính .ForeColor của nó và nuốt tất cả nhấp chuột. Điều này sẽ mô phỏng vô hiệu hóa điều khiển và cho phép cuộn không bị cản trở.

+3

Vấn đề với cách tiếp cận đó là bàn phím vẫn có thể được sử dụng để thực hiện lựa chọn. –

+0

Vì vậy, sự kiện nhấn phím nuốt? – Michael

+0

Vâng, đây không phải là câu trả lời hay, tôi sẽ không làm điều này. – Yusha

1

Trong khi nó dành cho Silverlight, có thể bài đăng trên blog này sẽ giúp bạn đi đúng hướng? Silverlight No Selection ListBox and ViewBox

+0

Đây là hoàn hảo đối với tôi, nhờ gửi bài cho các liên kết –

8

Nếu bạn nhìn vào mẫu điều khiển của ListBox, có một ScrollBar và ItemsPresenter bên trong. Vì vậy, làm cho các ItemsPresenter bị vô hiệu hóa và bạn sẽ nhận được điều này một cách dễ dàng. Sử dụng phong cách dưới đây trên ListBox và bạn tốt để đi.

<Style x:Key="disabledListBoxWithScroll" TargetType="{x:Type ListBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBox}"> 
        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1"> 
         <ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false"> 
          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" IsEnabled="False" IsHitTestVisible="True"/> 
         </ScrollViewer> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
         </Trigger> 
         <Trigger Property="IsGrouping" Value="true"> 
          <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Trên ListBox sử dụng Style

<ListBox Style="{DynamicResource disabledListBoxWithScroll}" ..... /> 
1

tôi đã sử dụng giải pháp này, nó thực sự dễ dàng và hoạt động hoàn hảo:

Đối với mỗi SurfaceListBoxItem item bạn đặt trong Listbox, làm điều này:

item.IsHitTestVisible = false; 
+0

Công việc này hoàn hảo trong khi không có điều khiển tương tác trong mục, nếu không các điều khiển đó sẽ không thể thực hiện được. – jarvanJiang

0

Một tùy chọn đáng xem xét khác là vô hiệu hóa ListBoxItems. Điều này có thể được thực hiện bằng cách thiết lập ItemContainerStyle như được hiển thị trong đoạn mã sau.

<ListBox ItemsSource="{Binding YourCollection}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Nếu bạn không muốn các văn bản để có màu xám, bạn có thể xác định màu sắc tàn tật bằng cách thêm một bàn chải với các nguồn lực của phong cách với phím sau: {x: Static SystemColors.GrayTextBrushKey}. Giải pháp khác sẽ là ghi đè lên mẫu điều khiển ListBoxItem.

Câu hỏi này khá giống với câu hỏi này: There ain't ListBox.SelectionMode=“None”, is there another way to disable selection in a listbox? và câu trả lời của tôi giống nhau.

0

Tôi tìm thấy một giải pháp rất đơn giản và thẳng về phía trước làm việc cho tôi, tôi hy vọng nó sẽ làm cho bạn là tốt

<ListBox.ItemContainerStyle> 
<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Focusable" Value="False"/> 
</Style> 

2

tôi thấy rằng việc đưa một ListBox khuyết tật trong một ScrollViewer với tính năng tự di chuyển được bật cho hiệu ứng mong muốn.

+0

Cái gì? Điều này không hoạt động. – Yusha

0

Một câu trả lời hoàn chỉnh sử dụng http://www.codeproject.com/Tips/60619/Scrollable-Disabled-ListBox-in-WPF

Các Kiểu:

<Style TargetType="{x:Type local:CustomListBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomListBox}"> 
       <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1"> 
        <ScrollViewer IsEnabled="True"> 
         <ItemsPresenter IsEnabled="{Binding Path=IsEnabledWithScroll, RelativeSource={RelativeSource TemplatedParent}}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Lớp

public class CustomListBox : ListBox 
{ 
    public bool IsEnabledWithScroll 
    { 
     get { return (bool)GetValue(IsEnabledWithScrollProperty); } 
     set { SetValue(IsEnabledWithScrollProperty, value); } 
    } 

    public static readonly DependencyProperty IsEnabledWithScrollProperty = 
     DependencyProperty.Register("IsEnabledWithScroll", typeof(bool), typeof(CustomListBox), new UIPropertyMetadata(true)); 
} 

Sau đó, thay vì setted IsEnabled trên ListBox, sử dụng IsEnabledWithScroll để thay thế. Việc cuộn sẽ hoạt động nếu hộp danh sách được bật hoặc tắt.

0

Dường như có nhiều cách để làm cho con mèo này trở nên đặc biệt. Tôi thấy rằng bằng cách thiết lập IsHitTestVisible trên ItemsContainerStyle trong XAML Tôi có chính xác những gì tôi cần:

<ListBox IsHitTestVisible="true" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="IsHitTestVisible" Value="False" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
Các vấn đề liên quan