Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF ListView关闭选择_Wpf_Listview - Fatal编程技术网

WPF ListView关闭选择

WPF ListView关闭选择,wpf,listview,Wpf,Listview,是否可以关闭WPF列表视图的选择,这样当用户单击行时,该行不会高亮显示 我希望单击时第1行与第0行一样 可能相关:我可以设置悬停/选择的外观样式吗?将蓝色渐变悬停外观(第3行)替换为自定义纯色。我已经找到了,不幸的是没有帮助 (不使用ListView也可以实现同样的效果。我只希望能够像ListView那样使用逻辑滚动和UI虚拟化) ListView的XAML是: <ListView Height="280" Name="listView">

是否可以关闭WPF
列表视图的选择,这样当用户单击行时,该行不会高亮显示

我希望单击时第1行与第0行一样

可能相关:我可以设置悬停/选择的外观样式吗?将蓝色渐变悬停外观(第3行)替换为自定义纯色。我已经找到了,不幸的是没有帮助

(不使用ListView也可以实现同样的效果。我只希望能够像ListView那样使用逻辑滚动和UI虚拟化)

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

根据Martin Konicek的评论,以最简单的方式完全禁用项目选择:

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

...
但是,如果您仍然需要ListView的功能,如能够选择项目,则可以直观地禁用所选项目的样式设置,如下所示:

您可以通过多种方式实现这一点,从更改ListViewItem到仅设置样式(更简单)。您可以使用创建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}" />

进一步了解上述解决方案。。。我将使用MultiTrigger允许鼠标悬停高亮显示在选择后继续工作,以便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>

摩尔的答案无效,这里的页面:

解释了为什么它不能工作

如果listview仅包含基本文本,则解决此问题的最简单方法是使用透明笔刷

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

如果listview的单元格包含诸如组合框之类的控件,这将产生不希望的结果,因为它还会更改控件的颜色。要解决此问题,必须重新定义控件的模板

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

以下是Blend中ListViewItem的默认模板:

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

将每个ListViewItem的样式设置为Focusable设置为false

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

我找到的最简单的方法是:

<Setter Property="Focusable" Value="false"/>

列表视图的一个属性是
ishitestvisible

取消选中它。

好吧,游戏已经有点晚了,但是这些解决方案都没有达到我想要的效果。 这些解决方案有几个问题

  • 禁用ListViewItem,这会破坏样式并禁用所有子控件
  • 从命中测试堆栈中删除,即子控件永远不会让鼠标停留或单击
  • 让它不可聚焦,这对我来说不起作用
  • 我想要一个带有分组标题的ListView,每个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>
    

    这适用于可能遇到以下要求的其他人:

  • 完全替换“选定”的视觉指示(例如,使用某种形状),而不仅仅是更改标准高光的颜色
  • 将此选定指示与模型的其他视觉表示一起包含在数据模板中,但是
  • 不希望必须向模型类中添加“IsSelectedItem”属性,并在所有模型对象上手动操作该属性
  • 要求在ListView中可以选择项目
  • 还想替换IsMouseOver的视觉表示
  • 如果你像我一样(在.NET4.5中使用WPF)
    <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>
    
    <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>
    </ListView.ItemContainerStyle>
    
    <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> 
    
    <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>
    
            <ListView Grid.Row="1" ItemsSource="{Binding Properties}" >
                <!--Disable selection of items-->
                <ListView.Resources>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="BorderBrush" Value="Transparent"/>
                        <Setter Property="VerticalContentAlignment" Value="Center"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListViewItem}">
                                    <Grid Background="{TemplateBinding Background}">
                                        <Border Name="Selection" Visibility="Collapsed" />
                                        <!-- This is used when GridView is put inside the ListView -->
                                        <GridViewRowPresenter Grid.RowSpan="2"
                                          Margin="{TemplateBinding Padding}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.Resources>
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="90" DisplayMemberBinding="{Binding Name}"  />
                        <GridViewColumn Width="90" CellTemplateSelector="{StaticResource customCellTemplateSelector}"  />
                    </GridView>
                </ListView.View>
            </ListView>