【WPF】DataGrid でセルフォーカス時の枠線を消し去る
おはようございます。
急に技術的な投稿となりますが、
C#@WPFのクライアントアプリケーションにて
データグリッドのセルフォーカス時の枠線を表示しない方法を紹介します。
スポンサーリンク
サンプルアプリの作成
まずは単純にデータグリッドに手っ取り早くデータを表示する
サンプルアプリケーションを作成します。
Visual Studio にて、WPFアプリケーションプロジェクトを新規で作成し、
生成されたメインウィンドウの Xaml に次のコードを記述します。
MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | <Windowx: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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceWpfApp1 {     classCat     {         publicintNo{get;set;}         publicStringName{get;set;}         publicStringSex{get;set;}         publicStringAge{get;set;}         publicStringKind{get;set;}         publicStringFavorite{get;set;}     } }  | 
MainWindowのクラスファイルには次のように記述します。
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 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; namespaceWpfApp1 {     /// <summary>     /// MainWindow.xaml の相互作用ロジック     /// </summary>     publicpartial classMainWindow:Window     {         publicMainWindow()         {             InitializeComponent();             // とりあえずサクっとデータをバインドする             this.dataGrid.ItemsSource=new[]             {                 newCat{No=1,Name="そら",Sex="♂",Age="6",Kind="キジトラ",Favorite="犬の人形"},                 newCat{No=2,Name="りく",Sex="♂",Age="5",Kind="長毛種(不明)",Favorite="人間"},                 newCat{No=3,Name="うみ",Sex="♀",Age="4",Kind="ミケ(っぽい)",Favorite="高級ウェットフード"},                 newCat{No=4,Name="こうめ",Sex="♀",Age="2",Kind="サビ",Favorite="横取りフード"}             };         }     } }  | 
ひとまずこれで一覧を表示することができるはず。
サンプルアプリの起動
VisualStudio より、「デバッグなしで起動」を実行します。

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

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

複数選択した際もセルの枠線が太くなります。
修正する
データグリッドのスタイルをいじり次のようにしたいと思います。
- セルの枠線を消す
 - 行ごとのハイライト
 - 複数選択不可
 - 行の高さを広げる
 - 最後の列をぴったりグリッドに合わせる
 
修正後ソース
MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42  | <Windowx: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"                   AlternationCount="1"AlternatingRowBackground="#B2CEEBF7"SelectionMode="Single"Grid.Row="1"                   HorizontalGridLinesBrush="Gray"VerticalGridLinesBrush="Gray">             <DataGrid.CellStyle>                 <Style TargetType="DataGridCell">                     <!-- セルフォーカス時の枠線を消す -->                     <Setter Property="BorderThickness" Value="0"/>                     <Setter Property="FocusVisualStyle" Value="{x:Null}"/>                     <!-- 行高さを大きくした際に、セル内容の縦配置を真ん中にする -->                     <Setter Property="Height" Value="25"/>                     <Setter Property="Template">                         <Setter.Value>                             <ControlTemplate TargetType="{x:TypeDataGridCell}">                                 <Grid Background="{TemplateBindingBackground}">                                     <ContentPresenter VerticalAlignment="Center"Margin="4,4,4,4"/>                                 </Grid>                             </ControlTemplate>                         </Setter.Value>                     </Setter>                 </Style>             </DataGrid.CellStyle>             <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"Width="40"/>                 <DataGridTextColumn Binding="{Binding Age}"ClipboardContentBinding="{x:Null}"Header="年齢"IsReadOnly="True"Width="40"/>                 <DataGridTextColumn Binding="{Binding Kind}"ClipboardContentBinding="{x:Null}"Header="種別"IsReadOnly="True"Width="120"/>                 <DataGridTextColumn Binding="{Binding Favorite}"ClipboardContentBinding="{x:Null}"Header="好物"IsReadOnly="True"Width="*"/>             </DataGrid.Columns>         </DataGrid>     </Grid> </Window>  | 
具体的な修正部分については、ソースを見比べてみてください。
これを実行すると次のような表示に変更されます。

少し見やすくなりましたかね。
まとめ
WPFアプリは、Windowsフォームと違い (ほんとかな?)
WEBのように色々とスタイルが変更できるので、出来るだけ見やすく使いやすくしたいですね。
WPFアプリについてはまだまだ初心者で勉強中ですが、またなにかあれば投稿したいと思います。
では。










ディスカッション
コメント一覧
まだ、コメントがありません