Reputation: 8336
I can change it to SizeWE in e.g. Loaded, Initialized, MouseEnter event handler, but after column resize it is changed back to default. Trying to change it in e.g. MouseUp or DragCompleted event handler to SizeWE does not work. When mouse button is released in the end of the resize the cursor is changed to default. When the SizeWE change was done in MouseEnter handler it is ok again when mouse exits and enters again, but the problem is right after the resize.
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>
code behind:
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;
}
}
Upvotes: 0
Views: 1509
Reputation: 11
Do this to force the mouse cursor on the gripper without overriding the template
public static void ColumnHeaderGripper(DataGrid datagrid)
{
var columnpresenter = typeof(DataGrid)
.GetProperty("ColumnHeadersPresenter",
BindingFlags.NonPublic | BindingFlags.Instance);
var headerpresenter = (DataGridColumnHeadersPresenter)
columnpresenter.GetValue(datagrid);
for (var i = 1; i < headerpresenter.Items.Count; i++) {
var columnheader = (DataGridColumnHeader)
headerpresenter.ItemContainerGenerator.ContainerFromIndex(i);
var leftgripper = typeof(DataGridColumnHeader)
.GetField("_leftGripper",
BindingFlags.NonPublic | BindingFlags.Instance);
var rightgripper = typeof(DataGridColumnHeader)
.GetField("_rightGripper",
BindingFlags.NonPublic | BindingFlags.Instance);
var leftThumb = (Thumb)leftgripper.GetValue(columnheader);
var rightThumb = (Thumb)rightgripper.GetValue(columnheader);
leftThumb.MouseEnter += (s, e) => {
System.Windows.Input.Mouse.OverrideCursor = Cursors.SizeWE; };
leftThumb.MouseLeave += (s, e) => {
System.Windows.Input.Mouse.OverrideCursor = Cursors.Arrow; };
rightThumb.MouseEnter += (s, e) => {
System.Windows.Input.Mouse.OverrideCursor = Cursors.SizeWE; };
rightThumb.MouseLeave += (s, e) => {
System.Windows.Input.Mouse.OverrideCursor = Cursors.Arrow; };
}
}
Upvotes: 0
Reputation: 9944
One radical solution is to set Mouse.OverrideCursor
when the cursor enters the Thumb, and set it back when the cursor leaves:
<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>
Handlers:
private void UIElement_OnMouseEnter(object sender, MouseEventArgs e)
{
Mouse.OverrideCursor = Cursors.SizeWE;
}
private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
{
Mouse.OverrideCursor = null;
}
Upvotes: 1