我一头栽进这个一也。要解决它,我不得不做两件事:
- 修改ListView的标题ControlTemplate。
- 处理ControlTemplate中Thumb的DragDelta事件。
ListView的标题是GridViewColumnHeader。 下面显示的是GridViewColumnHeader的ControlTemplate的简化版本。正如我们所看到的,它在Canvas中使用Thumb来创建拖动/调整大小效果。
PS:为了获得完整的GridViewColumnHeader的ControlTemplate请参阅How to grab WPF 4.0 control default templates?
<ControlTemplate TargetType="GridViewColumnHeader">
<Grid SnapsToDevicePixels="True">
<Border BorderThickness="0,1,0,1" Name="HeaderBorder" ...>
<!-- omitted -->
</Border>
<Border BorderThickness="1,0,1,1" Name="HeaderHoverBorder" Margin="1,1,0,0" />
<Border BorderThickness="1,1,1,0" Name="HeaderPressBorder" Margin="1,0,0,1" />
<Canvas>
<Thumb Name="PART_HeaderGripper">
<!-- omitted -->
</Thumb>
</Canvas>
</Grid>
<ControlTemplate.Triggers>
<!-- omitted -->
</ControlTemplate.Triggers>
所以为了限制GridViewColumnHeader的大小,我们需要挂钩拇指的拖动事件(DragStarted,DragDelta ,DragCompleted ...等)。
原来我们所需要的只是DragDelta事件,只要我们知道DragDeltaEventHandler内的MinSize即可。
下面显示的是带有注释的修改XAML。
<Grid Width="500">
<Border BorderBrush="Black" BorderThickness="2" Margin="20">
<ListView SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="Header 1" Width="Auto">
<!-- Apply a style targeting GridViewColumnHeader with MinWidth = 80 and a ControlTemplate -->
<GridViewColumn.HeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="MinWidth" Value="80" />
<Setter Property="Control.Template" Value="{DynamicResource myGridViewColumnHeaderControlTemplate}" />
</Style>
</GridViewColumn.HeaderContainerStyle>**
</GridViewColumn>
<GridViewColumn Header="Header 2" Width="Auto" />
</GridView>
</ListView.View>
</ListView>
</Border>
</Grid>
在myGridViewColumnHeaderControlTemplate添加一些XAML到:
- 绑定GridViewColumnHeader的minWidth到画布的minWidth。
- 连接Thumb的DragDelta事件。
<ControlTemplate x:Key="TemplateGridViewColumnHeader" TargetType="GridViewColumnHeader">
<!-- omitted -->
<Canvas MinWidth="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MinWidth, Mode=OneTime}">
<Thumb x:Name="PART_HeaderGripper" DragDelta="myGridViewColumnHeader_DragDelta">
最后myGridViewColumnHeader_DragDelta功能:
private void myGridViewColumnHeader_DragDelta(object sender, DragDeltaEventArgs e)
{
DependencyObject parent = sender as DependencyObject;
try
{
do
{
parent = VisualTreeHelper.GetParent(parent as DependencyObject);
} while (parent.GetType() != typeof(Canvas));
Canvas canvas = parent as Canvas;
if (canvas.ActualWidth + e.HorizontalChange < canvas.MinWidth)
{
e.Handled = true;
}
}
catch
{
}
}
这是我找工作的唯一途径。希望有一个更简单的方法。
GridViewColumn甚至没有一个minWidth属性。您不能在不存在的样式或控件模板中设置属性。请发布您的XAML,以了解如何在GridViewColumn上设置MinWidth。 – Paparazzi 2012-04-11 00:20:24
在链接中,它演示了如何使用Thumb和处理DragDelta事件来完成MinWidth。有没有办法在控制模板中完成此操作? – Elan 2012-04-11 00:24:35