2009-02-09 13 views
7

इस सुबह के खिलाफ मेरे सिर को टक्कर लगी।डब्ल्यूपीएफ: सूची बॉक्स अक्षम करें, लेकिन स्क्रॉलिंग सक्षम करें

असल में, मेरे पास एक सूची बॉक्स है, और मैं लोगों को लंबे समय तक चलने वाली प्रक्रिया के दौरान चयन बदलने से रोकना चाहता हूं, लेकिन उन्हें अभी भी स्क्रॉल करने की अनुमति देता हूं।

समाधान:

सभी उत्तर, अच्छे थे मैं माउस घटनाओं निगलने साथ चला गया के बाद से था कि सबसे सीधे आगे। मैंने एक ही घटना में पूर्वावलोकनमाउसडाउन और पूर्वावलोकनमाउसअप को वायर्ड किया, जिसने मेरी पृष्ठभूमि की जांच की। वर्कर.इस्बुसी, और यदि यह इवेंट पर आईशैंडेड प्रॉपर्टी सेट किया गया तो यह सच हो गया।

उत्तर

1

चाल वास्तव में अक्षम नहीं है। अक्षम करने से स्क्रॉल बॉक्स से सभी संदेशों को लॉक कर दिया जाएगा।

लंबे ऑपरेशन के दौरान, इसके द्वारा उपयोग किए गए सूची बॉक्स में टेक्स्ट को ग्रे करें। फोरकोलर प्रॉपर्टी और सभी माउस क्लिक निगलें। यह नियंत्रण को अक्षम करने अनुकरण करेगा और स्क्रॉलिंग को बिना छेड़छाड़ की अनुमति देगा।

+3

पोस्टिंग कि दृष्टिकोण के साथ दिक्कत यह है कि कुंजीपटल अभी भी करने के लिए इस्तेमाल किया जा सकता है के लिए धन्यवाद चयन करें –

+0

तो कुंजीपटल घटनाओं को निगलें? – Michael

+0

हाँ यह वास्तव में एक अच्छा जवाब नहीं है, मैं यह नहीं करूँगा। – Yusha

1

हालांकि यह सिल्वरलाइट के लिए है, हो सकता है कि यह ब्लॉग पोस्ट आपको सही दिशा में जाने में मदद करेगी? Silverlight No Selection ListBox and ViewBox

+0

यह मेरे लिए एकदम सही था, लिंक –

8

यदि आप ListBox के नियंत्रण टेम्पलेट में देखते हैं, तो इसमें स्क्रॉलबार और आइटम प्रस्तुतकर्ता है। तो आइटम प्रस्तुतकर्ता को अक्षम करें और आपको यह आसानी से मिल जाएगा। Listbox पर bellow शैली का उपयोग करें और आप जाने के लिए अच्छे हैं।

<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> 

ListBox पर शैली

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

मैं इस समाधान का इस्तेमाल किया उपयोग करें, यह वास्तव में आसान है और पूरी तरह से काम करता है:

हर SurfaceListBoxItem item आप Listbox में डाल के लिए, इस कार्य करें:

item.IsHitTestVisible = false; 
+0

आइटम में कोई इंटरैक्शन नियंत्रण नहीं होने पर यह सही काम करता है, अन्यथा उन नियंत्रणों में असमर्थता होगी। – jarvanJiang

0

ListBoxItems को अक्षम करने पर विचार करने का एक और विकल्प है। यह निम्न स्निपेट में दिखाए गए आइटमकंटनर स्टाइल को सेट करके किया जा सकता है।

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

आप पाठ ग्रे होने के लिए नहीं करना चाहते हैं आप कुंजी निम्नलिखित के साथ शैली के संसाधनों तक एक ब्रश जोड़कर विकलांग रंग निर्दिष्ट कर सकते हैं: {x: स्टेटिक SystemColors.GrayTextBrushKey}। दूसरा समाधान ListBoxItem नियंत्रण टेम्पलेट को ओवरराइड करना होगा।

यह प्रश्न इस जैसा है: There ain't ListBox.SelectionMode=“None”, is there another way to disable selection in a listbox? और मेरा उत्तर वही है।

0

मैं एक बहुत ही सरल और सीधे आगे समाधान मेरे लिए काम कर पाया, मुझे आशा है कि यह आप के लिए और साथ ही

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

2

करना होगा मैंने पाया कि ऑटो स्क्रॉल के साथ एक ScrollViewer में एक विकलांग ListBox डाल सक्षम वांछित प्रभाव देता है।

+0

क्या? यह काम नहीं करता है। – Yusha

0

एक पूरा जवाब http://www.codeproject.com/Tips/60619/Scrollable-Disabled-ListBox-in-WPF

शैली का उपयोग कर:

<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> 

वर्ग

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)); 
} 

तो बजाय ListBox पर IsEnabled setted, IsEnabledWithScroll बजाय का उपयोग करें। यदि सूची बॉक्स सक्षम या अक्षम है तो स्क्रॉलिंग काम करेगी।

0

इस विशेष बिल्ली को त्वचा के कई तरीके होने लगते हैं। मैंने पाया कि XAML में ItemsContainerStyle पर IsHitTestVisible की स्थापना करके मुझे मिल गया मैं वास्तव में क्या जरूरत:

<ListBox IsHitTestVisible="true" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="IsHitTestVisible" Value="False" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
संबंधित मुद्दे