禁用按钮按下不可排序的WPF ListView标头中的反馈

时间:2010-05-18 15:10:02

标签: wpf sorting listview header

对于绑定到一个不需要或不支持排序的简单列表的WPF ListView,你如何做到这一点,以便用户点击标题时没有按下按钮反馈?默认情况下,单击列标题的中间感觉就像按下按钮,没有任何反应。

我想要实现的外观和感觉的一个例子是在系统控制面板>高级系统设置>用户档案设置。配置文件列表不支持排序。因此,单击时标题不响应(列调整大小点击除外)。

2 个答案:

答案 0 :(得分:5)

您可以通过在不希望可点击的列标题上将“IsEnabled”设置为false来完成此操作。我粘贴了一个我用作测试的例子。我做的唯一另一件事是更改前景画笔,以便禁用的列标题与其他标题一样显示为黑色。

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="120">
                <GridViewColumnHeader IsEnabled="True"  Content="Col A" Foreground="Black"/>
            </GridViewColumn>
            <GridViewColumn Width="120">
                <GridViewColumnHeader IsEnabled="False" Content="Col B" Foreground="Black"/>
            </GridViewColumn>
        </GridView>
    </ListView.View>
    <ListViewItem>1</ListViewItem>
    <ListViewItem>4</ListViewItem>
    <ListViewItem>2</ListViewItem>
    <ListViewItem>3</ListViewItem>
</ListView>

第一列是可点击的,第二列则不是。希望这有帮助!

编辑:我的评论中引用的示例。此方法会启用标头,但仍然不允许单击它:

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="120">
                <GridViewColumnHeader Content="Col A"/>
            </GridViewColumn>
            <GridViewColumn Width="120">
                <GridViewColumnHeader Content="Col B" PreviewMouseDown="GridViewColumnHeader_PreviewMouseDown"/>
            </GridViewColumn>
        </GridView>
    </ListView.View>
    <ListViewItem>1</ListViewItem>
    <ListViewItem>4</ListViewItem>
    <ListViewItem>2</ListViewItem>
    <ListViewItem>3</ListViewItem>

该事件的代码隐藏:

private void GridViewColumnHeader_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

这基本上“吃掉”对此按钮所做的任何点击。不幸的是,它还会阻止您调整大小,因为您需要单击以调整大小。可能有一种方法可以测试点击是否是“按钮”点击或“调整大小区域”点击,只处理按钮点击,但我不确定。

答案 1 :(得分:1)

如果要禁用所有ListView的标题按钮,请在Application.Resources下的Application.xaml文件中创建样式。执行此操作时,标题将不会很大。

<Application>
...
    <Application.Resources>
<Style TargetType="{x:Type GridViewColumnHeader}" >
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                <Border BorderBrush="LightGray" BorderThickness="1,0,1,0">
                    <TextBlock Text="{TemplateBinding Content}" TextAlignment="Center" 
                               Background="LightSteelBlue"  />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

...从 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/02212923-85bc-4a20-a41c-c1b558fce8c1/