【问题标题】:How to change WPF GridViewColumnHeader gripper cursor permanently?如何永久更改 WPF GridViewColumnHeader 抓手光标?
【发布时间】:2018-03-29 17:07:50
【问题描述】:

我可以将它更改为 SizeWE,例如已加载、已初始化、MouseEnter 事件处理程序,但在调整列大小后,它会更改回默认值。试图改变它,例如SizeWE 的 MouseUp 或 DragCompleted 事件处理程序不起作用。在调整大小结束时释放鼠标按钮时,光标将更改为默认值。当在 MouseEnter 处理程序中完成 SizeWE 更改时,鼠标退出并再次进入时再次正常,但问题就在调整大小之后。

xaml:

   <Style x:Key="GridView.ColumnHeader.Gripper.Style" TargetType="{x:Type Thumb}" BasedOn="{StaticResource Theme.DataGrid.ColumnHeader.Gripper.Style}">
        <Setter Property="Width" Value="20" />
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="Cursor" Value="SizeWE" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="{x:Type GridViewColumnHeader}" >
        <Setter Property="FontWeight" Value="{StaticResource Theme.DataGrid.ColumnHeader.FontWeight}"></Setter>
        <Setter Property="BorderBrush" Value="Transparent"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="Background" Value="{StaticResource Theme.DataGrid.ColumnHeader.Background}"></Setter>
        <Setter Property="Foreground" Value="{StaticResource Theme.DataGrid.ColumnHeader.Foreground}"></Setter>
        <Setter Property="HorizontalContentAlignment" Value="Left"></Setter>
        <Setter Property="Padding" Value="{StaticResource  Theme.DataGrid.Cell.Padding}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="1" />
                        </Grid.ColumnDefinitions>
                        <Border Grid.Column="0"  x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}">
                            <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                        </Border>
                        <Thumb Grid.Column="1" x:Name="PART_HeaderGripper" HorizontalAlignment="Right"  
                               Style="{DynamicResource GridView.ColumnHeader.Gripper.Style}" 
                               Cursor="SizeWE" 
                               MouseUp="PART_HeaderGripper_MouseUp" 
                               MouseEnter="PART_HeaderGripper_MouseEnter"
                               Margin="-18,0, 0, 0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

后面的代码:

    private void PART_HeaderGripper_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Thumb gripper = (Thumb)sender;
        if (gripper != null)
        {
            gripper.Cursor = Cursors.SizeWE;
        }
    }
    private void PART_HeaderGripper_MouseEnter(object sender, MouseEventArgs e)
    {
        Thumb gripper = (Thumb)sender;
        if (gripper != null)
        {
            gripper.Cursor = Cursors.SizeWE;
        }
    }

【问题讨论】:

    标签: wpf xaml controltemplate


    【解决方案1】:

    一个根本的解决方案是在光标进入Thumb时设置Mouse.OverrideCursor,并在光标离开时设置回来:

    <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="1" />
                            </Grid.ColumnDefinitions>
                            <Border Grid.Column="0"  x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}">
                                <ContentPresenter Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                            </Border>
                            <Thumb MouseEnter="UIElement_OnMouseEnter" MouseLeave="UIElement_OnMouseLeave" Grid.Column="1" x:Name="PART_HeaderGripper" HorizontalAlignment="Right"  
                               Style="{DynamicResource GridView.ColumnHeader.Gripper.Style}"                                
                               Margin="-18,0, 0, 0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
    

    处理程序:

    private void UIElement_OnMouseEnter(object sender, MouseEventArgs e)
        {
            Mouse.OverrideCursor = Cursors.SizeWE;
        }
    
        private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
        {
            Mouse.OverrideCursor = null;
        }
    

    【讨论】:

    • 那么,这就是你要找的吗?
    • 抱歉,没有。标题调整大小的光标应该只出现在正确的位置。此解决方案使光标在标题中的任何位置都显示为调整光标大小。所以它显示为调整大小,但行为类似于拖动(重新排序列)。
    • 你为什么不修改你的答案,将处理程序交给 Thumb,而不是 Grid,我接受并授予你赏金。这样它似乎工作得很好。
    • 正是你发现我在做什么 :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多