WPFのDataGridヘッダにアンダースコアを表示する方法

この記事は公開から2年以上経過しています。

問題

WPFのDataGridヘッダに含まれる(最初の)アンダースコア_が表示されない。

検証コード

MainWindow.xaml.cs

using System.Linq;
using System.Windows;

namespace WPFDataGridHeaderTest211207
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new
            {
                Items = Enumerable.Range(0, 10).Select(n => new Data { ID_COLUMN = n, DATA_COLUMN = $"Data{n}" })
            };
        }

        public sealed class Data
        {
            public int ID_COLUMN { get; set; }

            public string DATA_COLUMN { get; set; }
        }
    }
}

MainWindow.xaml

<Window
    x:Class="WPFDataGridHeaderTest211207.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WPFDataGridHeaderTest211207"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="DataGridHeaderTest"
    Width="400"
    Height="300"
    mc:Ignorable="d">
    <Grid Margin="5">
        <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Items, Mode=OneWay}" />
    </Grid>
</Window>

対応前のDataGridヘッダ
file


原因

ヘッダテキストのアンダースコアがアクセスキーとして扱われる。

対応前のビジュアルツリー(Snoop)
file


対応

アンダースコアがアクセスキーとして処理されないようにDataGridColumnHeaderのContentTemplateを作成する。
※アクセスキーを使用したい場合は別途対応が必要。

MainWindow.xaml

<Window
    x:Class="WPFDataGridHeaderTest211207.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WPFDataGridHeaderTest211207"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="DataGridHeaderTest"
    Width="400"
    Height="300"
    mc:Ignorable="d">
    <Grid Margin="5">
        <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Items, Mode=OneWay}">
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Text="{Binding Mode=OneWay}" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.Resources>
        </DataGrid>
    </Grid>
</Window>

対応後のDataGridヘッダ
file

対応後のビジュアルツリー(Snoop)
file

ちなみに、このような一見良くわからない問題でも過去のエントリ「WPF開発が捗るツール」で紹介しているツールSnoopを使えば、あっという間に解決できます。


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする