2019-01-24に更新

【WPF】DataGrid でセルフォーカス時の枠線を消し去る

C#@WPFのクライアントアプリケーションにて
データグリッドのセルフォーカス時の枠線を表示しない方法を紹介します。

サンプルアプリの作成
まずは単純にデータグリッドに手っ取り早くデータを表示する
サンプルアプリケーションを作成します。

Visual Studio にて、WPFアプリケーションプロジェクトを新規で作成し、生成されたメインウィンドウの Xaml に次のコードを記述します。

MainWindow.xaml

<Window x:Class="WpfApp1.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="一覧" Height="350" Width="525">
    <Grid>
        <DataGrid Name="dataGrid" HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/>
                <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/>
                <DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True"/>
                <DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True"/>
                <DataGridTextColumn Binding="{Binding Kind}" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/>
                <DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="120"/>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>

 

クラスを追加し、次のように記述します。
データグリッドにバインドするデータを保持するための単純なクラスです。

Cat.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1
{
    class Cat
    {
        public int No { get; set; }
        public String Name { get; set; }
        public String Sex { get; set; }
        public String Age { get; set; }
        public String Kind { get; set; }
        public String Favorite { get; set; }
    }
}

 

MainWindowのクラスファイルには次のように記述します。

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// &lt;summary&gt;
    /// MainWindow.xaml の相互作用ロジック
    /// &lt;/summary&gt;
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // とりあえずサクっとデータをバインドする
            this.dataGrid.ItemsSource = new[]
            {
                new Cat { No = 1, Name = "そら", Sex = "&#x2642;", Age = "6", Kind = "キジトラ", Favorite = "犬の人形"},
                new Cat { No = 2, Name = "りく", Sex = "&#x2642;", Age = "5", Kind = "長毛種(不明)", Favorite = "人間"},
                new Cat { No = 3, Name = "うみ", Sex = "&#x2640;", Age = "4", Kind = "ミケ(っぽい)", Favorite = "高級ウェットフード"},
                new Cat { No = 4, Name = "こうめ", Sex = "&#x2640;", Age = "2", Kind = "サビ", Favorite = "横取りフード"}
            };
        }
    }
}

ひとまずこれで一覧を表示することができるはず。

サンプルアプリの起動
VisualStudio より、「デバッグなしで起動」を実行します。

データグリッド

初期表示でデータが表示されます。
通常だと、セルを選択すると次のような表示になります。
(列単位で読み取りのみとしているので編集はできません)

セル選択時の表示

セルを選択すると、選択行がハイライトされ、選択されたセルの枠線が太線で表示されます。
個人的にこれが気に食わない・・。

複数選択時の表示

複数選択した際もセルの枠線が太くなります。
修正する
データグリッドのスタイルをいじり次のようにしたいと思います。

セルの枠線を消す
行ごとのハイライト
複数選択不可
行の高さを広げる
最後の列をぴったりグリッドに合わせる

修正後ソース

MainWindow.xaml

&lt;Window x:Class="WpfApp1.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="一覧" Height="350" Width="525"&gt;
    &lt;Grid&gt;
        &lt;DataGrid Name="dataGrid" HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" AutoGenerateColumns="False"
                  AlternationCount="1" AlternatingRowBackground="#B2CEEBF7" SelectionMode="Single" Grid.Row="1" 
                  HorizontalGridLinesBrush="Gray" VerticalGridLinesBrush="Gray" &gt;
            &lt;DataGrid.CellStyle&gt;
                &lt;Style TargetType="DataGridCell"&gt;
                    &lt;!-- セルフォーカス時の枠線を消す --&gt;
                    &lt;Setter Property="BorderThickness" Value="0"/&gt;
                    &lt;Setter Property="FocusVisualStyle" Value="{x:Null}"/&gt;
                    &lt;!-- 行高さを大きくした際に、セル内容の縦配置を真ん中にする --&gt;
                    &lt;Setter Property="Height" Value="25"/&gt;
                    &lt;Setter Property="Template"&gt;
                        &lt;Setter.Value&gt;
                            &lt;ControlTemplate TargetType="{x:Type DataGridCell}"&gt;
                                &lt;Grid Background="{TemplateBinding Background}"&gt;
                                    &lt;ContentPresenter VerticalAlignment="Center" Margin="4,4,4,4" /&gt;
                                &lt;/Grid&gt;
                            &lt;/ControlTemplate&gt;
                        &lt;/Setter.Value&gt;
                    &lt;/Setter&gt;
                &lt;/Style&gt;
            &lt;/DataGrid.CellStyle&gt;
            &lt;DataGrid.Columns&gt;
                &lt;DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/&gt;
                &lt;DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/&gt;
                &lt;DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True" Width="40"/&gt;
                &lt;DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True" Width="40"/&gt;
                &lt;DataGridTextColumn Binding="{Binding Kind}" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/&gt;
                &lt;DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="*"/&gt;
            &lt;/DataGrid.Columns&gt;
        &lt;/DataGrid&gt;

    &lt;/Grid&gt;
&lt;/Window&gt;

 

具体的な修正部分については、ソースを見比べてみてください。

これを実行すると次のような表示に変更されます。

変更後データグリッド

少し見やすくなりましたかね。
まとめ
WPFアプリは、Windowsフォームと違い (ほんとかな?)
WEBのように色々とスタイルが変更できるので、出来るだけ見やすく使いやすくしたいですね。

WPFアプリについてはまだまだ初心者で勉強中ですがまたなにかあれば投稿したいと思います。

ではでは。

Originally published at www.doraxdora.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント