aierda 2023-10-30 17:38 采纳率: 72.1%
浏览 72
已结题

设置DataGridColumnHeader文字大小的问题

问题描述:

img


这是我的我的目的,大致的代码如下:

<UserControl x:Class="BookDispenser.Views.AccessibilityReservedItemList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:converter="clr-namespace:BookDispenser.Converters"
             mc:Ignorable="d" 
             d:DesignHeight="1500" d:DesignWidth="800">
    <UserControl.Resources>
        <converter:CalcFontSize x:Key="CalcFontSize" />
        <converter:MultiplyConverter x:Key="MultiplyConverter" />
        <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">  //这里定义DataGrid表头样式,包括字体大小
            <Setter Property="FontSize" 
           /*
                 这里通过一个Converter去改变表头文字的大小,FontSizeScale是动态值,从ViewModel中过来,表示缩放比例,比如0.8, 1.2CalcFontSize是一个Converter,实现FontSizeScaleConverterParameter相乘,即30 * FontSizeScale。
               但是很可惜,达不到效果。同样的方式应用于TextBlock,Button中是没有问题的
            */
            Value="{Binding FontSizeScale,Converter={StaticResource CalcFontSize}, ConverterParameter=30}">
            </Setter>
            <Setter Property="Foreground" Value="White"></Setter>
            <Setter Property="FontWeight" Value="Bold"></Setter>
            <Setter Property="Padding" Value="0 10 20 10"></Setter>
            <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
            <Setter Property="BorderThickness" Value="0 0 1 0"></Setter>
        </Style>
    </UserControl.Resources>
        <DataGrid AutoGenerateColumns="False" x:Name="dgBookList" ItemsSource="{Binding BookList}" Height="720" GridLinesVisibility="Horizontal" IsReadOnly="True" Margin="0 30">

            <DataGrid.Columns>
                <DataGridTemplateColumn Header="预约待取项目" Width="420" HeaderStyle="{StaticResource ColumnHeaderStyle}"
                     CellStyle="{StaticResource ColumnCellStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                                /*
                                      还有这个地方也是不生效的
                                 */  
                            <TextBlock Style="{StaticResource cellTextBlock}" HorizontalAlignment="Center" Text="{Binding BookNumber}"
                                    FontSize="{Binding FontSizeScale,Converter={StaticResource CalcFontSize}, ConverterParameter=20}">
                       </TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="预约待取期限" Width="435" HeaderStyle="{StaticResource ColumnHeaderStyle}" CellStyle="{StaticResource ColumnCellStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Style="{StaticResource cellTextBlock}" HorizontalAlignment="Center" Text="{Binding ReservedDate}">
                            </TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Width="158"  Header="选取项" HeaderStyle="{StaticResource ColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox FontSize="12" FontWeight="Bold" Foreground="White" HorizontalAlignment="Center" Margin="0 15 0 0">
                                <CheckBox.LayoutTransform>
                                    <ScaleTransform ScaleX="2.5" ScaleY="2.5" />
                                </CheckBox.LayoutTransform>
                            </CheckBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                    <DataGridTemplateColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="BorderThickness" Value="0"/>
                        </Style>
                    </DataGridTemplateColumn.CellStyle>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
</UserControl>

如代码所示,ColumnHeaderStyle用于定义DataGrid表头样式,包括字体大小。
我通过一个Converter去改变表头文字的大小,FontSizeScale是动态值,从ViewModel中过来,表示缩放比例,
比如0.8, 1.CalcFontSize是一个Converter,实现FontSizeScale和ConverterParameter相乘,即30 * FontSizeScal
但是很可惜,达不到效果。同样的方式应用于TextBlock,Button中是没有问题的。
同样在DataTemplate中设置TextBlock的FontSize也是不生效的

提出问题:
基于我上面的提到的两个地方,一个是表头文字大小,一个是cell文字大小,真的没有办法去动态改变吗?
求解决方案,期待各位的指点,感谢!

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-30 17:41
    关注
    • 问题是,DataGridColumnHeader和DataGridTemplateColumn中的CellTemplate默认的数据上下文(DataContext)不是ViewModel,而是DataGrid或者DataGrid所绑定的ItemsSource。这是为什么你不能直接从这两处绑定到ViewModel的FontSizeScale属性。

    1. 用ElementName

    1. UserControl设置一个Name属性:

      <UserControl x:Name="RootControl" ... >
      
    2. 修改DataGridColumnHeaderCellTemplate中的绑定,来用ElementName

      <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
       <Setter Property="FontSize" 
              Value="{Binding DataContext.FontSizeScale, ElementName=RootControl, Converter={StaticResource CalcFontSize}, ConverterParameter=30}">
       </Setter>
       ...
      </Style>
      

      对于CellTemplate内的TextBlock

      <TextBlock HorizontalAlignment="Center" Text="{Binding BookNumber}"
              FontSize="{Binding DataContext.FontSizeScale, ElementName=RootControl, Converter={StaticResource CalcFontSize}, ConverterParameter=20}">
      </TextBlock>
      

    2. 用RelativeSource

    1. 修改DataGridColumnHeader的绑定,来用RelativeSource

      <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
       <Setter Property="FontSize" 
              Value="{Binding DataContext.FontSizeScale, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource CalcFontSize}, ConverterParameter=30}">
       </Setter>
       ...
      </Style>
      
    2. 对于CellTemplate内的TextBlock,用RelativeSource

      <TextBlock HorizontalAlignment="Center" Text="{Binding BookNumber}"
              FontSize="{Binding DataContext.FontSizeScale, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource CalcFontSize}, ConverterParameter=20}">
      </TextBlock>
      

    以上就是在WPF中用ElementNameRelativeSource方法来从ViewModel获取FontSizeScale属性并将其绑定到DataGridColumnHeaderCellTemplate中的TextBlock的说明。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月30日