मैं सूची बॉक्स में चयन को कैसे अक्षम कर सकता हूं?
मैं सूची बॉक्स में चयन को कैसे अक्षम कर सकता हूं?
जवाबों:
ItemsControl
जब तक आप के अन्य पहलुओं की जरूरत है ListBox
, आप ItemsControl
इसके बजाय उपयोग कर सकते हैं । यह आइटम को अंदर ItemsPanel
रखता है और उसमें चयन की अवधारणा नहीं है।
<ItemsControl ItemsSource="{Binding MyItems}" />
डिफ़ॉल्ट रूप से, ItemsControl
अपने बाल तत्वों के वर्चुअलाइजेशन का समर्थन नहीं करता है। यदि आपके पास बहुत से आइटम हैं, तो वर्चुअलाइजेशन मेमोरी के उपयोग को कम कर सकता है और प्रदर्शन में सुधार कर सकता है, जिस स्थिति में आप दृष्टिकोण 2 और शैली का उपयोग कर सकते हैं ListBox
, या वर्चुअलाइजेशन को अपने साथ जोड़ सकते हैंItemsControl
।
ListBox
वैकल्पिक रूप से, केवल लिस्टबॉक्स को ऐसे स्टाइल करें कि चयन दिखाई न दे।
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<!-- SelectedItem with focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent" />
<!-- SelectedItem without focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Transparent" />
<!-- SelectedItem text foreground -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.Resources>
ItemsControl
चयन की किसी भी अवधारणा को पूरी तरह से हटा देगा।
मुझे मेरे लिए काम करने का एक बहुत ही सरल और सीधा आगे समाधान मिला, मुझे आशा है कि यह आपके लिए भी करेगा
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Focusable = "False"
!
<Setter Property="IsHitTestVisible" Value="False" />
आप एक के ItemsControl
बजाय का उपयोग करने के लिए स्विच कर सकते हैं ListBox
। एक ItemsControl
चयन की कोई अवधारणा नहीं है, इसलिए वहाँ बंद करने के लिए कुछ भी नहीं है।
ItemTemplate
।
विचार करने लायक एक अन्य विकल्प सूची बॉक्स को अक्षम कर रहा है। यह निम्न स्निपेट में दिखाए गए अनुसार ItemContainerStyle को सेट करके किया जा सकता है।
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
यदि आप पाठ को ग्रे नहीं करना चाहते हैं, तो आप निम्न कुंजी के साथ शैली के संसाधनों में ब्रश जोड़कर अक्षम रंग निर्दिष्ट कर सकते हैं: {x: Static SystemColors.GrayTextBrushKey}। अन्य समाधान ListBoxItem नियंत्रण टेम्पलेट को ओवरराइड करने के लिए होगा।
यह भी काम करेगा, अगर मुझे आइटमकंट्रोल के बजाय लिस्टबॉक्स का उपयोग करने की आवश्यकता है, लेकिन मैं केवल उन वस्तुओं को प्रदर्शित कर रहा हूं जो चयन करने योग्य नहीं होना चाहिए, मैं उपयोग करता हूं:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
यहाँ बहुत अच्छे उत्तर हैं, लेकिन मैं कुछ अलग तलाश कर रहा था: मैं चयन चाहता हूं, लेकिन बस यह नहीं दिखाना चाहता हूं (या एक अलग मामले में दिखाया गया है)।
ऊपर दिए गए समाधान मेरे लिए पूरी तरह से काम नहीं करते थे, इसलिए मैंने कुछ और किया: मैंने अपनी सूची बॉक्स के लिए एक नई शैली का उपयोग किया, जो पूरी तरह से टेम्पलेट्स को फिर से परिभाषित करता है:
<Style x:Key="PlainListBoxStyle" TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
इसके साथ शुरू करते हुए, आप आसानी से खुद के चयन को उजागर कर सकते हैं, या इसे ऐसे ही छोड़ सकते हैं यदि आप कोई भी नहीं चाहते हैं।
जबकि @ ड्रू नोक का जवाब ज्यादातर मामलों के लिए एक त्वरित समाधान है, इसमें एक दोष है जो x को सेट करने के साथ आता है: स्टेंसिल ब्रश।
जब आप x सेट करते हैं: जैसा कि सुझाव दिया गया है, स्थैतिक ब्रश, सभी बच्चे सूची बॉक्स आइटम के भीतर नियंत्रण करते हैं, इस शैली को विरासत में मिलेगा।
इसका मतलब है कि, जबकि यह सूची बॉक्स आइटम के हाइलाइटिंग को अक्षम करने के लिए काम करेगा, इसके परिणामस्वरूप बच्चे के नियंत्रण के लिए अवांछित प्रभाव हो सकते हैं।
उदाहरण के लिए, यदि आपके पास अपने ListBoxItem के भीतर एक ComboBox था, तो यह ComboBox के भीतर हाइलाइटिंग पर माउस को अक्षम कर देगा।
इसके बजाय, चयनित का चयन करने के लिए विचार करें, अचयनित, और माउसओवर घटनाओं को इस स्टैकओवरफ़्लो धागे में वर्णित समाधान में कवर किया गया है: सूची बॉक्स से नियंत्रण हाइलाइट निकालें, लेकिन बच्चे नियंत्रण नहीं ।
-Frinny
मैं अभी तक एक और समाधान का प्रस्ताव। बस फिर से खाका ListBoxItem
एक से अधिक कुछ नहीं होने के लिए ContentPresenter
, जैसे ...
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
इस दृष्टिकोण के लिए मेरे कारण इस प्रकार हैं:
मेरे मामले में, मैं अपने अंतर्वस्तु के साथ उपयोगकर्ता सहभागिता को अक्षम नहीं करना चाहता, ListBoxItems
इसलिए सेट करने का समाधान IsEnabled
मेरे लिए काम नहीं करेगा।
अन्य समाधान जो ListBoxItem
रंग-संबंधित गुणों को ओवरराइड करके फिर से स्टाइल करने का प्रयास करता है, केवल उन उदाहरणों के लिए काम करता है जहां आपको यकीन है कि टेम्पलेट इन गुणों का उपयोग करता है। यह डिफ़ॉल्ट शैलियों के लिए ठीक है, लेकिन कस्टम शैलियों के साथ टूट जाता है।
समाधान जो ItemsControl
कई अन्य चीजों का भी उपयोग करता है क्योंकि ItemsControl
मानक की तुलना में यह पूरी तरह से अलग है ListBox
और वर्चुअलाइजेशन का समर्थन नहीं करता है, जिसका अर्थ है कि आपको ItemsPanel
वैसे भी फिर से टेम्पलेट देना होगा ।
उपरोक्त डिफ़ॉल्ट रूप नहीं बदलता है ListBox
, के लिए डेटा टेम्प्लेट में आइटम अक्षम नहीं करता है, डिफ़ॉल्ट रूप से ListBox
वर्चुअलाइजेशन का समर्थन करता है, और जो भी शैली आपके ऐप में उपयोग में नहीं हो सकती है या स्वतंत्र रूप से काम करती है। यह KISS सिद्धांत है।
नोट: यह समाधान कीबोर्ड नेविगेशन या राइट क्लिक द्वारा चयन को अक्षम नहीं करता है (यानी अंतरिक्ष कुंजी के बाद तीर कुंजी)
पिछले सभी उत्तर या तो पूरी तरह से चयन क्षमता (रनटाइम में स्विचन नहीं) को हटाते हैं या केवल दृश्य प्रभाव को हटाते हैं, लेकिन चयन नहीं।
लेकिन क्या होगा यदि आप कोड द्वारा चयन का चयन करना और दिखाना चाहते हैं, लेकिन उपयोगकर्ता इनपुट द्वारा नहीं? क्या आप पूरे लिस्टबॉक्स को अक्षम नहीं करते हुए उपयोगकर्ता के चयन को "फ्रीज" करना चाहते हैं?
समाधान के लिए पूरे ItemContentTemplate को एक बटन में लपेटना है जिसमें कोई दृश्य क्रोम नहीं है। बटन का आकार आइटम के आकार के बराबर होना चाहिए, इसलिए यह पूरी तरह से कवर किया गया है। अब बटन का उपयोग करें सक्षम-संपत्ति:
आइटम के चयन-स्थिति को "फ्रीज" करने के लिए बटन को सक्षम करें। यह कार्य करता है क्योंकि सक्षम बटन लिस्टबॉक्सइम-ईवेंटहैंडलर तक बबल करने से पहले सभी माउस ईवेंट को खाता है। आपके ItemDataTemplate को अभी भी MouseEvents प्राप्त होंगे क्योंकि यह बटन सामग्री का हिस्सा है।
क्लिक करके चयन को बदलने में सक्षम करने के लिए बटन को अक्षम करें।
<Style x:Key="LedCT" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Button IsEnabled="{Binding IsSelectable, Converter={StaticResource BoolOppositeConverter}}" Template="{DynamicResource InvisibleButton}">
<ContentPresenter />
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="InvisibleButton" TargetType="{x:Type Button}">
<ContentPresenter/>
</ControlTemplate>
dartrax
हो सकता है कि आपको आइटम्सकंट्रोल की जरूरत है? यह चयन की अनुमति नहीं देता है:
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
उदाहरण के लिए विंडोज फोन पर काम करने वाला एक साधारण फिक्स नल के लिए चयनित आइटम की चयन सेटिंग पर है:
<ListBox SelectionChanged="ListBox_SelectionChanged">
और पीछे के कोड में:
private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
(sender as ListBox).SelectedItem = null;
}
मुझे एक सही रास्ता मिल गया।
सूची बॉक्स IsHitTestV अदृश्य को झूठा सेट करें ताकि उपयोगकर्ता माउस हॉवर न कर सके या नीचे स्क्रॉल न कर सके या स्क्रॉल न कर सके।
कैप्चर पूर्वावलोकनGotKeyboardFocus e.Handled = सही ताकि उपयोगकर्ता कीबोर्ड टैब द्वारा आइटम का चयन कर सके, एरो अप, एरो डाउन।
इस तरह से फायदा:
xmal
<ListBox Name="StudentsListBox" ItemsSource="{Binding Students}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" IsHitTestVisible="False" PreviewGotKeyboardFocus="StudentsListBox_PreviewGotKeyboardFocus">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="Yellow" />
<Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Name="GradeBlock" Text="{Binding Grade}" FontSize="12" Margin="0,0,5,0"/>
<TextBlock Grid.Column="1" Name="NameTextBlock" Text="{Binding Name}" FontSize="12" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
कोड
private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
e.Handled = true;
}
मेरे लिए सबसे अच्छा समाधान है:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="True"/>
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
सम्यक = असत्य
अपने लिस्टबॉक्स / ड्रॉपडाउन में एक या अधिक विकल्पों को निष्क्रिय करने के लिए, आप नीचे दिखाए गए अनुसार "अक्षम" विशेषता जोड़ सकते हैं। यह उपयोगकर्ता को इस विकल्प के चयन से रोकता है, और इसे ग्रे ओवरले मिलता है।
ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);