【问题标题】:wpf datagrid angled header stylewpf datagrid有角度的标题样式
【发布时间】:2012-10-19 17:09:56
【问题描述】:

我正在创建基于Margaret Parsons article 的DataGrid 角度标题样式。 现在它看起来像这样:

<Style x:Key="DataGridColumnHeaderAngle" 
       TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
          <Grid x:Name="HeaderGrid" ShowGridLines="True" 
              Width="30">
            <Rectangle Name="HeaderRect" Fill="Azure" Stroke="Black" 
                       Width="{TemplateBinding Width}"
                       Height="{TemplateBinding Height}">
              <Rectangle.RenderTransform>
                <SkewTransform CenterX="0" AngleX="-60" AngleY="0"
                     CenterY="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                              Path=ActualHeight }"/>
                </Rectangle.RenderTransform>
            </Rectangle>

            <TextBlock Text="{TemplateBinding Content}"
                   Background="Aqua"
                   VerticalAlignment="Bottom" HorizontalAlignment="Left">
                <TextBlock.LayoutTransform>
                  <RotateTransform Angle="-30"/>
                </TextBlock.LayoutTransform>
                <TextBlock.RenderTransform>
                  <TranslateTransform  X="20"/>
                </TextBlock.RenderTransform>
            </TextBlock>

            <!--ContentPresenter Content="{TemplateBinding Content}" Width="200"
                          VerticalAlignment="Bottom" HorizontalAlignment="Left">
              <ContentPresenter.LayoutTransform>
                <RotateTransform Angle="-30"/>
              </ContentPresenter.LayoutTransform>
              <ContentPresenter.RenderTransform>
                <TranslateTransform  X="18"/>
              </ContentPresenter.RenderTransform>
            </ContentPresenter-->

          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

ContentPresenter 已更改为彩色TextBlock 以查看其边界。

我的问题:默认情况下,列宽等于标题文本宽度,因此单元格位置的使用不是最佳的。 当我减小列 (HeaderGrid) 宽度(通过绑定/转换器或手动)时,标题文本宽度也会减小

See image

有没有办法在不剪切标题文本的情况下减小列宽?

【问题讨论】:

    标签: .net wpf datagrid header angle


    【解决方案1】:

    我知道这是很久以前的事了,但我使用同一个博客来实现我的倾斜标题,我想我会发布我的裁剪解决方案。 我发现 ContentPresenter 的物理布局框架受其父级限制,因此通过在右边距上使用负数,将扩展 contentpresenter 的布局框架,以便呈现文本。

    (注意:在我的解决方案中,我使用了 TextBlock,而不是 ContentPresenter)

    我将Control的右边距绑定到自身的inverse ActualWidth,以保证正确的边距:

    <TextBlock.Margin>
        <Binding ElementName="HeaderContent"
                 Path="ActualWidth"
                 Converter="{StaticResource MarginConverter}" />
    </TextBlock.Margin>
    

    使用转换器:

    <TextBlock.Resources>
        <converters:AngledHeadersMarginConverter x:Key="MarginConverter" />
    </TextBlock.Resources>
    

    这样做:

    class AngledHeadersMarginConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return new Thickness(0, 0, -(double)value, 0);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    这似乎解决了问题。

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2011-12-18
      • 2016-02-12
      相关资源
      最近更新 更多