कोई ListBox.SelectionMode = "कोई नहीं" है, क्या सूची बॉक्स में चयन को अक्षम करने का एक और तरीका है?


189

मैं सूची बॉक्स में चयन को कैसे अक्षम कर सकता हूं?


1
क्या आप एक उदाहरण प्रदान कर सकते हैं जहां एक लिस्टबॉक्स होना मान्य है जिसे आप नहीं चुन सकते हैं? चूंकि मुख्य व्यवहार वस्तुओं का चयन करना है। मैंने शायद इसे प्रदर्शित करने के लिए एक और तरीका चुना। (यह मैं एक आलोचक बनने की कोशिश नहीं कर रहा हूं, बल्कि इसमें एक वास्तविक रुचि है जहां यह हो सकता है)
मैरिटिन

3
@Martin: उदाहरण के लिए यदि आप किसी सूची बॉक्स से सामग्री खींचना चाहते हैं - इस मामले में आप शायद उस आइटम को चुनने में रुचि नहीं रखते हैं। ALSO: किसी आइटम को खींचते समय: जब आप सूची
बॉक्स के

1
मेरा मानना ​​है कि शिमी लिस्टबॉक्स का उपयोग करना चाहता है, इसका कारण यह है कि पूछने वाला कभी-कभी सूची बॉक्स का चयन कर सकता है। प्रश्न मेरे लिए भी मूल्यवान है। कहते हैं कि आप एक ताश का खेल खेल रहे हैं। आप अपने कार्ड में से एक कार्ड का चयन कर सकते हैं, कभी-कभी, आप कई बार और अन्य समयों का चयन कर सकते हैं, आप कोई भी चयन नहीं कर सकते।
Gqqnbig

1
साथ ही, कभी-कभी आपके पास 10 कार्ड होते हैं और उनमें से केवल 4 ही चयन करने योग्य होते हैं। 4 में से, आप 3 तक का चयन कर सकते हैं
Gqqnbig

1
@ मैरथिन: जब आपके पास लिस्टबॉक्स में एक ग्रिड व्यू होता है। ग्रिडव्यू हेडर बहुत अधिक कार्यक्षमता प्रदान करते हैं जो अन्यत्र उपलब्ध नहीं है। और आपने ग्रिडव्यू की कोशिकाओं में नियंत्रण संपादित किया है।
रॉबिन डेविस

जवाबों:


264

दृष्टिकोण 1 - ItemsControl

जब तक आप के अन्य पहलुओं की जरूरत है ListBox, आप ItemsControlइसके बजाय उपयोग कर सकते हैं । यह आइटम को अंदर ItemsPanelरखता है और उसमें चयन की अवधारणा नहीं है।

<ItemsControl ItemsSource="{Binding MyItems}" />

डिफ़ॉल्ट रूप से, ItemsControlअपने बाल तत्वों के वर्चुअलाइजेशन का समर्थन नहीं करता है। यदि आपके पास बहुत से आइटम हैं, तो वर्चुअलाइजेशन मेमोरी के उपयोग को कम कर सकता है और प्रदर्शन में सुधार कर सकता है, जिस स्थिति में आप दृष्टिकोण 2 और शैली का उपयोग कर सकते हैं ListBox, या वर्चुअलाइजेशन को अपने साथ जोड़ सकते हैंItemsControl

दृष्टिकोण 2 - स्टाइलिंग 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>

24
नहीं, यह केवल दृश्य प्रभाव को बदलेगा, न कि वास्तविक चयन व्यवहार
थॉमस लेवेस्क

8
मेरा पहला सुझाव ItemControl का उपयोग करना था। क्या आपको वह याद आया? :)
ड्रू नोक

5
इन टिप्पणियों को फिर से पढ़कर मैं यह बताना चाहता हूं कि @ थोमस लेवेस्क की टिप्पणी केवल दूसरे दृष्टिकोण के बारे में सच है जो मैं दिखाता हूं। सादे का उपयोग ItemsControlचयन की किसी भी अवधारणा को पूरी तरह से हटा देगा।
ड्रू नोक

1
ItemControl समाधान बॉक्स स्क्रॉलिंग सपोर्ट (स्क्रॉलबार और मूसवेल) को हटा दें।
मुईबिएन कर्लोटा

1
+1 दृष्टिकोण 1 के लिए - ItemControl। यदि हमारे पास एक बहुत बड़ा पृष्ठ है जिसे हमें स्क्रॉल करना है, यदि उपयोगकर्ता एक सूची बॉक्स में रखता है, तो यह प्रभावी रूप से माउसव्हील को निष्क्रिय कर देता है क्योंकि सूची बॉक्स माउसव्यूएल घटनाओं को पकड़ लेता है। इसका मतलब यह है कि उपयोगकर्ता निराश हो जाता है कि पूरे पृष्ठ को स्क्रॉल करने के लिए उपयोग किया जाने वाला मूसली बेतरतीब ढंग से काम करना बंद कर देगा, यह इस बात पर निर्भर करता है कि माउस एक सूची बॉक्स पर है या नहीं।
कंटीनो

159

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

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

मुझे लगता है कि वह यहां से काफी अच्छी तरह से गुजरा
Sid

3
यह पूर्ण है। यह चयनित आइटम को रोकता है और बटन जैसे अन्य नियंत्रण अभी भी काम करता है। वास्तव में मैं क्या देख रहा था
फ्रेंक

1
इस दृष्टिकोण के लिए +1। यदि हमारे पास एक बहुत बड़ा पृष्ठ है, जिसे हमें स्क्रॉल करना है, यदि उपयोगकर्ता एक सूची बॉक्स पर है, तो यह प्रभावी रूप से माउसव्हील को निष्क्रिय कर देता है क्योंकि सूची बॉक्स माउसव्हील घटनाओं को पकड़ लेता है। इसका मतलब यह है कि उपयोगकर्ता निराश हो जाता है कि पूरे पृष्ठ को स्क्रॉल करने के लिए उपयोग किया जाने वाला मूसली बेतरतीब ढंग से काम करना बंद कर देगा, यह इस बात पर निर्भर करता है कि माउस एक सूची बॉक्स पर है या नहीं।
कंटेंग

अति उत्कृष्ट। इसी तरह के दृष्टिकोण ने भी मेरे लिए काम किया जब मुझे आइटम पर बटन की आवश्यकता थी ताकि आइटम चयन न हो - लेकिन केवल अगर आइटम के अन्य क्षेत्र पर क्लिक किया गया था। बस बटन सेट Focusable = "False"!
जॉनी एडमिट

1
माउसओवर हाइलाइटिंग को हटाने के लिए इस अतिरिक्त संपत्ति को जोड़ें: <Setter Property="IsHitTestVisible" Value="False" />
DonBoitnott

25

आप एक के ItemsControlबजाय का उपयोग करने के लिए स्विच कर सकते हैं ListBox। एक ItemsControlचयन की कोई अवधारणा नहीं है, इसलिए वहाँ बंद करने के लिए कुछ भी नहीं है।


2
आकर्षक। मुझे कभी नहीं पता था कि आप सीधे आइटमकंट्रोल की घोषणा कर सकते हैं, मुझे लगा कि यह आभासी (मस्टोवराइड) है, धन्यवाद !!!
शिम्मी वेइटहैंडलर

लेकिन क्या ItemControl अभी भी एक लाइन में मेरे आइटम प्रस्तुत करेगा?
चेंग

@ हाँ, यह होगा, और इसके अलावा, आप हमेशा मैन्युअल रूप से सेट कर सकते हैं ItemTemplate
शिमी वेइटहैंडलर

2
यह बहुत अधिक कार्यक्षमता खो देता है - जैसे, स्क्रॉल करना।
जेफ

@ आप स्क्रॉल करने के लिए एक स्क्रॉल दृश्य में आइटम्सकंट्रोल को लपेट सकते हैं।
विल्का

12

विचार करने लायक एक अन्य विकल्प सूची बॉक्स को अक्षम कर रहा है। यह निम्न स्निपेट में दिखाए गए अनुसार ItemContainerStyle को सेट करके किया जा सकता है।

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

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


सरल और काम, धन्यवाद! और यह WP 8.1 रनटाइम पर भी लागू है।
मालुटेक

8

यह भी काम करेगा, अगर मुझे आइटमकंट्रोल के बजाय लिस्टबॉक्स का उपयोग करने की आवश्यकता है, लेकिन मैं केवल उन वस्तुओं को प्रदर्शित कर रहा हूं जो चयन करने योग्य नहीं होना चाहिए, मैं उपयोग करता हूं:

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="IsHitTestVisible" Value="False" />
    </Style>
</ListBox.ItemContainerStyle>

3

यहाँ बहुत अच्छे उत्तर हैं, लेकिन मैं कुछ अलग तलाश कर रहा था: मैं चयन चाहता हूं, लेकिन बस यह नहीं दिखाना चाहता हूं (या एक अलग मामले में दिखाया गया है)।

ऊपर दिए गए समाधान मेरे लिए पूरी तरह से काम नहीं करते थे, इसलिए मैंने कुछ और किया: मैंने अपनी सूची बॉक्स के लिए एक नई शैली का उपयोग किया, जो पूरी तरह से टेम्पलेट्स को फिर से परिभाषित करता है:

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

इसके साथ शुरू करते हुए, आप आसानी से खुद के चयन को उजागर कर सकते हैं, या इसे ऐसे ही छोड़ सकते हैं यदि आप कोई भी नहीं चाहते हैं।


2

जबकि @ ड्रू नोक का जवाब ज्यादातर मामलों के लिए एक त्वरित समाधान है, इसमें एक दोष है जो x को सेट करने के साथ आता है: स्टेंसिल ब्रश।

जब आप x सेट करते हैं: जैसा कि सुझाव दिया गया है, स्थैतिक ब्रश, सभी बच्चे सूची बॉक्स आइटम के भीतर नियंत्रण करते हैं, इस शैली को विरासत में मिलेगा।

इसका मतलब है कि, जबकि यह सूची बॉक्स आइटम के हाइलाइटिंग को अक्षम करने के लिए काम करेगा, इसके परिणामस्वरूप बच्चे के नियंत्रण के लिए अवांछित प्रभाव हो सकते हैं।

उदाहरण के लिए, यदि आपके पास अपने ListBoxItem के भीतर एक ComboBox था, तो यह ComboBox के भीतर हाइलाइटिंग पर माउस को अक्षम कर देगा।

इसके बजाय, चयनित का चयन करने के लिए विचार करें, अचयनित, और माउसओवर घटनाओं को इस स्टैकओवरफ़्लो धागे में वर्णित समाधान में कवर किया गया है: सूची बॉक्स से नियंत्रण हाइलाइट निकालें, लेकिन बच्चे नियंत्रण नहीं

-Frinny


2

मैं अभी तक एक और समाधान का प्रस्ताव। बस फिर से खाका ListBoxItemएक से अधिक कुछ नहीं होने के लिए ContentPresenter, जैसे ...

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

इस दृष्टिकोण के लिए मेरे कारण इस प्रकार हैं:

  1. मेरे मामले में, मैं अपने अंतर्वस्तु के साथ उपयोगकर्ता सहभागिता को अक्षम नहीं करना चाहता, ListBoxItemsइसलिए सेट करने का समाधान IsEnabledमेरे लिए काम नहीं करेगा।

  2. अन्य समाधान जो ListBoxItemरंग-संबंधित गुणों को ओवरराइड करके फिर से स्टाइल करने का प्रयास करता है, केवल उन उदाहरणों के लिए काम करता है जहां आपको यकीन है कि टेम्पलेट इन गुणों का उपयोग करता है। यह डिफ़ॉल्ट शैलियों के लिए ठीक है, लेकिन कस्टम शैलियों के साथ टूट जाता है।

  3. समाधान जो ItemsControlकई अन्य चीजों का भी उपयोग करता है क्योंकि ItemsControlमानक की तुलना में यह पूरी तरह से अलग है ListBoxऔर वर्चुअलाइजेशन का समर्थन नहीं करता है, जिसका अर्थ है कि आपको ItemsPanelवैसे भी फिर से टेम्पलेट देना होगा ।

उपरोक्त डिफ़ॉल्ट रूप नहीं बदलता है ListBox, के लिए डेटा टेम्प्लेट में आइटम अक्षम नहीं करता है, डिफ़ॉल्ट रूप से ListBoxवर्चुअलाइजेशन का समर्थन करता है, और जो भी शैली आपके ऐप में उपयोग में नहीं हो सकती है या स्वतंत्र रूप से काम करती है। यह KISS सिद्धांत है।


1

नोट: यह समाधान कीबोर्ड नेविगेशन या राइट क्लिक द्वारा चयन को अक्षम नहीं करता है (यानी अंतरिक्ष कुंजी के बाद तीर कुंजी)

पिछले सभी उत्तर या तो पूरी तरह से चयन क्षमता (रनटाइम में स्विचन नहीं) को हटाते हैं या केवल दृश्य प्रभाव को हटाते हैं, लेकिन चयन नहीं।

लेकिन क्या होगा यदि आप कोड द्वारा चयन का चयन करना और दिखाना चाहते हैं, लेकिन उपयोगकर्ता इनपुट द्वारा नहीं? क्या आप पूरे लिस्टबॉक्स को अक्षम नहीं करते हुए उपयोगकर्ता के चयन को "फ्रीज" करना चाहते हैं?

समाधान के लिए पूरे 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


1

हो सकता है कि आपको आइटम्सकंट्रोल की जरूरत है? यह चयन की अनुमति नहीं देता है:

<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />

3
@ शमी: तुच्छ उत्तरों के समान होना आम बात है। यहाँ किसी भी ध्वज के योग्य कोई दोहराव नहीं है। यदि आपके पास इस बारे में कोई और प्रश्न हैं, तो कृपया मेटा स्टैक ओवरफ्लो पर पूछें ।

0

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


1
हालांकि आपको टैब नेविगेशन को अक्षम करना होगा।
अमांडुह

0

उदाहरण के लिए विंडोज फोन पर काम करने वाला एक साधारण फिक्स नल के लिए चयनित आइटम की चयन सेटिंग पर है:

    <ListBox SelectionChanged="ListBox_SelectionChanged">

और पीछे के कोड में:

    private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        (sender as ListBox).SelectedItem = null;
    }

0

मुझे एक सही रास्ता मिल गया।
सूची बॉक्स IsHitTestV अदृश्य को झूठा सेट करें ताकि उपयोगकर्ता माउस हॉवर न कर सके या नीचे स्क्रॉल न कर सके या स्क्रॉल न कर सके।
कैप्चर पूर्वावलोकनGotKeyboardFocus e.Handled = सही ताकि उपयोगकर्ता कीबोर्ड टैब द्वारा आइटम का चयन कर सके, एरो अप, एरो डाउन।

इस तरह से फायदा:

  1. लिस्टबॉक्स आइटम फोरग्राउंड ग्रे नहीं बनेंगे।
  2. ListBox पृष्ठभूमि पारदर्शी पर सेट कर सकते हैं

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

-1

मेरे लिए सबसे अच्छा समाधान है:

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

-3

सम्यक = असत्य


2
यह सब ग्रे बनाता है, यह वह नहीं है
जिसकी

1
लेकिन यह सीधा सवाल का सीधा जवाब है :)
विक्टर Jevdokimov

1
एक सीधा आगे का जवाब यह है stackoverflow.com/questions/1398559/1398650#1398650 , लेकिन वैसे भी धन्यवाद
Shimmy Weitzhandler

मेरे लिए बहुत मदद की, मैं बाहर धूसर और विकलांग चाहता था!
मार्टिन रॉबिन्स

-3

अपने लिस्टबॉक्स / ड्रॉपडाउन में एक या अधिक विकल्पों को निष्क्रिय करने के लिए, आप नीचे दिखाए गए अनुसार "अक्षम" विशेषता जोड़ सकते हैं। यह उपयोगकर्ता को इस विकल्प के चयन से रोकता है, और इसे ग्रे ओवरले मिलता है।

ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);

उस समय आप उच्च हो गए और ASP.NET समाधान के साथ WPF प्रश्न का उत्तर दिया।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.