DataGridColumnHeader中的第一个下划线将被删除

本文关键字:删除 下划线 第一个 DataGridColumnHeader | 更新日期: 2023-09-27 18:25:24

我遇到了一个问题,我有一个DataGridColumnHeader,它正在接收以下划线为内容的文本,除非按alt,否则第一个下划线将隐藏("data_grid_thing"显示为"datagrid_thing(.然而,这对DataGridColumnHeader不起作用,因为它删除了所有其他样式,所以我没有使用包含文本的页眉,而是使用了包含文本的空白。我也尝试使用BasedOn属性,但没有效果。

我对通过C#端(可能通过某种方式找到ContentPresenter来修改RecognizesAccessKey属性)或通过修改XAML(找到保留默认样式的方法)的解决方案持开放态度。

我的XAML看起来像这样:

  <Style x:Key="DataGridColumnHeaderStyle" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridColumnHeader">
                    <Border>
                        <ContentPresenter 
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                            RecognizesAccessKey="False" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>   
    </Style>

谢谢!

DataGridColumnHeader中的第一个下划线将被删除

这是因为对AccessKey的处理。只需编写这样的事件处理程序,即可临时转义数据网格标头中的下划线。

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    string header = e.Column.Header.ToString();
    // Replace all underscores with two underscores, to prevent AccessKey handling
    e.Column.Header = header.Replace("_", "__");
}

这篇博客文章说,你可以通过将下划线加倍来转义:"data__grid_thing"

另一种方法可以在这个问题的公认答案

中找到

我喜欢umbreon222的解决方案。如果你和我一样,一直使用DataGrids,并且有一个你总是引用的库(就像我一样),你可以创建一个DataGrid类的子类,它一直注册该事件处理程序:

using System.Windows.Controls;
namespace MCLBZ7.Controls
{
    public class MCLDataGrid : DataGrid
    {
        public MCLDataGrid() : base()
        {
            this.AutoGeneratingColumn += DG_AG_Header;
        }
        private void DG_AG_Header(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string header = e.Column.Header.ToString();
            e.Column.Header = header.Replace("_", "__");
        }
    }
}