WPF数据表格倾斜的标题样式

3
我正在根据Margaret Parsons的文章创建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)宽度(通过绑定/转换器或手动方式)时,标题文本宽度也会减小。

查看图片

是否有任何方法可以缩小列宽而不削减标题文本?

1个回答

1
我知道这是很久以前的事情了,但我使用同样的博客来实现我的倾斜标题,并且我想发布我的解决方案来裁剪文本。我发现,ContentPresenter 的物理布局框架受其父元素的限制,因此通过在右边距上使用负数,可以扩展 contentpresenter 的布局框架,以便呈现文本。
(注意:在我的解决方案中,我使用了 TextBlock 而不是 ContentPresenter)
我将控件的右边距绑定到其自身的反向 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();
    }
}

这似乎解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接