2012-04-10 15 views
2

按照类似问题here的回答,我可以在XAML页面上设置MinWidth。如何将MinWidth应用于控件模板中的WPF中的ListView列?

我想要做的是在所有ListView的所有GridViewColumn的控件模板中完成此操作。

这可能吗?

更新:

我试过的样本代码的简单位下方,但它不工作:

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <Style TargetType="{x:Type GridViewColumnHeader}" > 
      <Setter Property="MinWidth" Value="200" /> 
     </Style> 
    </Window.Resources> 

    <Grid Width="500"> 
     <Border BorderBrush="Black" BorderThickness="2" Margin="20"> 
      <ListView SelectionMode="Single"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Header 1" Width="Auto"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="Hello There"/> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Header 2" Width="Auto" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 
     </Border> 
    </Grid> 
</Window> 
+0

GridViewColumn甚至没有一个minWidth属性。您不能在不存在的样式或控件模板中设置属性。请发布您的XAML,以了解如何在GridViewColumn上设置MinWidth。 – Paparazzi 2012-04-11 00:20:24

+0

在链接中,它演示了如何使用Thumb和处理DragDelta事件来完成MinWidth。有没有办法在控制模板中完成此操作? – Elan 2012-04-11 00:24:35

回答

3
<ListView> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock MinWidth="100"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       ...more columns... 
      </GridView> 
     </ListView.View> 
    </ListView> 
+1

问题是ALL没有一个 – Paparazzi 2012-04-11 00:09:35

+0

嗯,那么我不认为你可以... – 2012-04-11 03:44:32

+1

我其实正在寻找这样的解决方案。当您需要将其应用于特定列时,它非常适用。我只需要在文本块上添加绑定。 – Apostrofix 2015-11-24 19:21:43

4
<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" > 
     <Setter Property="MinWidth" Value="400" /> 
    </Style> 
</Window.Resources> 
+0

我试过了,但没有奏效。你不是说GridViewColumn没有MinWidth? – Elan 2012-04-11 00:38:40

+0

Read - GridViewColumnHeader - 不是GridViewColumn。我测试了它 - 它的工作原理。 – Paparazzi 2012-04-11 00:51:02

+0

我发布了一个样本,这不适合我。你能否看看有没有别的你可能在做的事情,我没有? – Elan 2012-04-11 01:13:12

4

我一头栽进这个一也。要解决它,我不得不做两件事:

  1. 修改ListView的标题ControlTemplate。
  2. 处理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到:

  1. 绑定GridViewColumnHeader的minWidth到画布的minWidth。
  2. 连接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 
     { 
     } 
    } 

这是我找工作的唯一途径。希望有一个更简单的方法。

+0

其实工作。谢谢。 – 2014-03-05 16:04:52

3

如果使用GridViewColumnHeader你可以处理大小的变化:

<GridView> 
    <GridViewColumn> 
     <GridViewColumnHeader Content="HeaderContent" SizeChanged="HandleColumnHeaderSizeChanged"/> 
    ... 
在代码

private void HandleColumnHeaderSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs) 
    { 
     if (sizeChangedEventArgs.NewSize.Width <= 60) { 
      sizeChangedEventArgs.Handled = true; 
      ((GridViewColumnHeader) sender).Column.Width = 60; 
     } 
    } 
+0

这正是我需要的!非常感谢你 – 2017-05-11 10:13:00