WPF ListView चयन बंद करें


119

मेरे पास एक सरल WPF सूची दृश्य और एक सरल प्रश्न है:

क्या चयन को बंद करना संभव है, इसलिए जब उपयोगकर्ता क्लिक करता है, तो पंक्ति को हाइलाइट नहीं किया जाता है?

सूची दृश्य

मैं पंक्ति 1 को पंक्ति 0 की तरह देखना चाहता हूँ जब क्लिक किया जाता है।

संभवतः संबंधित: क्या मैं हॉवर / चयन का रूप देख सकता हूँ? उदाहरण के लिए। एक कस्टम सॉलिड कलर के साथ ब्लू ग्रैडिएंट हॉवर लुक (लाइन 3) को बदलने के लिए। मैंने यह और यह पाया है , दुर्भाग्य से मदद नहीं कर रहा है।

(ListView का उपयोग किए बिना समान प्राप्त करना भी स्वीकार्य है। मैं सिर्फ लिविंग स्क्रॉल के रूप में तार्किक स्क्रॉलिंग और UI वर्चुअलाइजेशन का उपयोग करने में सक्षम होना चाहूंगा)

सूची दृश्य के लिए XAML है:

<ListView Height="280" Name="listView">
    <ListView.Resources>
        <!-- attempt to override selection color -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}"
                         Color="Green" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <!-- more columns -->
            </GridView.Columns>
        </GridView>
     </ListView.View>
</ListView>

मैंने पहले कभी भी WPF में एक ListView का उपयोग नहीं किया है, लेकिन मुझे यकीन है कि कुछ प्रकार की IsEnabled संपत्ति है, जो यदि गलत पर सेट की जाती है, तो पूरे नियंत्रण को अक्षम कर देगी और संभवत: वह प्राप्त करेगी जो आप के बाद है, लेकिन मैं हूं 100% यकीन नहीं है।
जेम्स मैककोनेल 20

नमस्ते, हाँ एक IsEnabled संपत्ति है, जो पूरे ListView को अक्षम कर सकती है। मुझे सामान्य रूप से काम करने के लिए सूची दृश्य की आवश्यकता है, बस चयन का प्रदर्शन न करें।
मार्टिन कोनिसक

जवाबों:


135

मार्टिन कॉनिसक की टिप्पणी के अनुसार, सरलतम तरीके से आइटमों के चयन को पूरी तरह से अक्षम करने के लिए:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

हालाँकि, यदि आपको अभी भी ListView की कार्यक्षमता की आवश्यकता है, जैसे किसी आइटम का चयन करने में सक्षम होना, तो आप चयनित आइटम की स्टाइलिंग को नेत्रहीन रूप से अक्षम कर सकते हैं जैसे:

आप इसे कई तरीके से कर सकते हैं, जिसमें लिस्ट व्यूइम के कंट्रोलटेम्पलेट को बदलने से लेकर सिर्फ एक स्टाइल सेट करना (बहुत आसान)। आप ItemContainerStyle का उपयोग करके ListViewItems के लिए एक शैली बना सकते हैं और इसे चयनित करने पर पृष्ठभूमि और सीमा ब्रश को 'बंद' कर सकते हैं।

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="Background"
                            Value="{x:Null}" />
                    <Setter Property="BorderBrush"
                            Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

इसके अलावा, जब तक आपके पास आइटम को चुनने पर उपयोगकर्ता को सूचित करने का कोई अन्य तरीका नहीं है (या सिर्फ परीक्षण के लिए) आप मूल्य का प्रतिनिधित्व करने के लिए एक कॉलम जोड़ सकते हैं:

<GridViewColumn Header="IsSelected"
                DisplayMemberBinding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />

2
संबंधित भाग नहीं देखा, लेकिन आप एक ही काम कर सकते हैं, पृष्ठभूमि और सीमा को सेट कर सकते हैं जैसा कि आप IsMouseOver संपत्ति पर चाहते हैं।
21

88
मैंने इसे अब और भी बेहतर तरीके से हल किया - <सेटर प्रॉपर्टी = "फोकस करने योग्य" मूल्य = "गलत" /> पूरी तरह से पंक्ति का चयन करने में अक्षम करता है।
मार्टिन कोनिसक

8
आह, मैंने सोचा था कि आप सिर्फ नेत्रहीन चयन को बंद करें। यदि आप उन्हें बिल्कुल नहीं चुनना चाहते हैं, तो आप एक ItemControl (चूँकि आप अभी भी चयनित आइटम को कोड के माध्यम से सेट कर सकते हैं यदि वे ध्यान देने योग्य नहीं हैं) का उपयोग करने पर एक नज़र डालना चाहते हैं, हालांकि ग्रिड को देखने के लिए आप 'कुछ इस तरह करना होगा: manicprogrammer.com/cs/blogs/… इसके अलावा, अगर आपने अभी तक नहीं किया है, तो आप WPF और XAML को एक बेहतरीन परिचय प्रदान करने वाली पुस्तक WPF अनलेशेड की जांच कर सकते हैं।
23

2
@MartinKonicek मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन आपकी उच्च रेटिंग वाली टिप्पणी का उत्तर होना चाहिए;)
WiiMaxx

1
@MartinKonicek मुझे जोड़ना था, BasedOn="{StaticResource {x:Type ListViewItem}}"इसलिए इसने मेरी बाकी ग्रिड शैलियों को ओवरराइड नहीं किया, लेकिन मुझे यह भी लगता है कि आपको अपनी टिप्पणी स्वीकार कर लेनी चाहिए
जंपएजा

31

मूर का जवाब काम नहीं करता है, और यहाँ पृष्ठ:

सूची बॉक्स में आइटम के लिए चयन रंग, सामग्री संरेखण और पृष्ठभूमि रंग निर्दिष्ट करना

बताते हैं कि यह काम क्यों नहीं कर सकता।

यदि आपकी सूची में केवल मूल पाठ शामिल है, तो समस्या को हल करने का सबसे सरल तरीका पारदर्शी ब्रश का उपयोग करना है।

<Window.Resources>
  <Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00000000"/>
    </Style.Resources>
  </Style>
</Window.Resources>

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

  <Window.Resources>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListViewItem}">
            <Border SnapsToDevicePixels="True" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}">
              <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                    Columns="{TemplateBinding GridView.ColumnCollection}" 
                                    Content="{TemplateBinding Content}"/>
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsEnabled" 
                       Value="False">
                <Setter Property="Foreground" 
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>

14
यह मेरी सूची में मेरे सभी आइटम गायब कर देता है
चक सेवेज

18

फोकस करने के लिए सेट करने के लिए प्रत्येक ListViewItem की शैली सेट करें।

<ListView ItemsSource="{Binding Test}" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

4
सरल और कुशल। और यह वास्तव में वही किया जाता है जो पूछा जाता है: यह चयन को सिर्फ छिपाने के बजाय बंद कर देता है। यह सबसे अच्छा जवाब है।
फ्यूमिडु

13

यहाँ Blend से ListViewItem के लिए डिफ़ॉल्ट टेम्प्लेट है:

डिफ़ॉल्ट सूची दृश्य टेम्पलेट:

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

डिफ़ॉल्ट टेम्पलेट को बदलने के लिए नीचे दिए गए कोड को अपनी शैली में जोड़कर केवल IsSelected ट्रिगर और IsSelected / IsSelectionActive MultiTrigger को हटा दें, और चयनित होने पर कोई दृश्य परिवर्तन नहीं होगा।

Isselected संपत्ति के दृश्य परिवर्तनों को बंद करने का समाधान:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>


8

इसके बाद के संस्करण के समाधान के लिए ... मैं एक मल्टीटैगर का उपयोग करके माउसओवर हाइलाइट्स को चयन के बाद काम करने के लिए जारी रखने की अनुमति दूंगा, जैसे कि आपका ListViewItem का स्टाइल:

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True" />
                            <Condition Property="IsMouseOver" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>

6

ठीक है, खेल के लिए थोड़ा देर से, लेकिन इनमें से कोई भी समाधान काफी नहीं था जो मैं करने की कोशिश कर रहा था। इन समाधानों में कुछ समस्याएं हैं

  1. ListViewItem को अक्षम करें, जो शैलियों को खराब कर देता है और सभी बच्चों को नियंत्रित करता है
  2. हिट-टेस्ट स्टैक से निकालें, अर्थात बच्चों के नियंत्रण को कभी भी माउस-ओवर या क्लिक नहीं मिलता है
  3. यह ध्यान देने योग्य नहीं है, यह सिर्फ सादा मेरे लिए काम नहीं किया?

मैं समूहीकरण हेडर के साथ एक सूची दृश्य चाहता था, और प्रत्येक ListViewItem का चयन या हॉवर के बिना बस 'सूचनात्मक' होना चाहिए, लेकिन ListViewItem में एक बटन है जिसे मैं क्लिक-सक्षम होना चाहता हूं और होवर-ओवर करना चाहता हूं।

तो, वास्तव में मैं क्या चाहता हूं कि ListViewItem बिल्कुल भी एक ListViewItem न हो, इसलिए, मैंने ListViewItem के ControlTemplate पर सवारी की और बस इसे एक साधारण ContentControl बना दिया।

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentControl Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                </ControlTemplate>
            </Setter.Value>
         </Setter>
     </Style>
</ListView.ItemContainerStyle>

5

सूची के गुणों में से एक है IsHitTestVisible। इसे अनचेक करें।


सरल और प्रभावी, स्क्रॉल व्यूअर के साथ मेरी समस्या को भी हल करें एक सूची दृश्य।
ब्रायन एनजी

1
मुझे सूचीव्यू आइटमटेम्पलेट के अंदर बटन टेम्पलेट मिला। यदि IsHitTestVisibleबटन अचयनित नहीं किया जा सकता है। यह अभिनय करता हैIsEnabled = false;
लुइवी

1

यह उन लोगों के लिए है जो निम्नलिखित आवश्यकताओं का सामना कर सकते हैं:

  1. पूरी तरह से "चयनित" (जैसे किसी प्रकार के आकार का उपयोग करें) के दृश्य संकेत की जगह, मानक हाइलाइट के रंग को बदलने से परे
  2. अपने मॉडल के अन्य दृश्य अभ्यावेदन के साथ DataTemplate में इस चयनित संकेत को शामिल करें, लेकिन,
  3. अपने मॉडल वर्ग में "IsSelectedItem" संपत्ति जोड़ना नहीं चाहते हैं और सभी मॉडल ऑब्जेक्ट पर उस संपत्ति को मैन्युअल रूप से हेरफेर करने का बोझ होना चाहिए।
  4. सूची दृश्य में चयन करने के लिए आइटम की आवश्यकता होती है
  5. इसके अलावा IsMouseOver के दृश्य प्रतिनिधित्व को बदलना चाहेंगे

यदि आप मेरे जैसे हैं (.NET 4.5 के साथ WPF का उपयोग करके) और पाया कि स्टाइल ट्रिगर्स से जुड़े समाधान बस काम नहीं आए, यहाँ मेरा समाधान है:

एक दृश्य में ListViewItem की ControlTemplate बदलें:

<ListView ItemsSource="{Binding MyStrings}" ItemTemplate="{StaticResource dtStrings}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

.. और डेटाटेम्पलेट:

<DataTemplate x:Key="dtStrings">
        <Border Background="LightCoral" Width="80" Height="24" Margin="1">
            <Grid >
                <Border Grid.ColumnSpan="2" Background="#88FF0000" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsMouseOver, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}"/>
                <Rectangle Grid.Column="0" Fill="Lime" Width="10" HorizontalAlignment="Left" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}" />
                <TextBlock Grid.Column="1" Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" />
            </Grid>
        </Border>
    </DataTemplate>

इस परिणाम में रनटाइम (आइटम 'बी' का चयन किया जाता है, आइटम 'डी' में माउस ओवर होता है):

सूची दृश्य


1

कोड का उपयोग करें:

   <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
           <Setter Property="Background" Value="Transparent`enter code here`" />
             <Setter Property="Template">
               <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ListViewItem}">
                   <ContentPresenter />
                 </ControlTemplate>
               </Setter.Value>
             </Setter>
          </Style>
   </ListView.ItemContainerStyle>

0

नीचे दिए गए कोड ListViewItem पंक्ति चयन को अक्षम करता है और पैडिंग, मार्जिन आदि को जोड़ने की भी अनुमति देता है।

<ListView.ItemContainerStyle>                                                                              
   <Style TargetType="ListViewItem">                                                                                      
       <Setter Property="Template">                                                                                            
         <Setter.Value>                                                                                             
           <ControlTemplate TargetType="{x:Type ListViewItem}">                                                                                                    
              <ListViewItem Padding="0" Margin="0">                                                                                                        
                  <ContentPresenter />
              </ListViewItem>
           </ControlTemplate>                                                          
         </Setter.Value>                                                                                       
         </Setter>
      </Style>                                                                      
  </ListView.ItemContainerStyle> 

0

नीचे कोड अक्षम करें ListViewItem पर ध्यान दें

<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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