WPFTooklitのDataGrid
で選択を無効にするにはどうすればよいですか? ListView
で動作するソリューションを変更しようとしました( WPF ListViewで選択をオフにする )が、動作しません:
<tk:DataGrid>
<tk:DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type tk:DataGridRow}">
<Setter Property="Focusable" Value="false"/>
</Style>
</tk:DataGrid.ItemContainerStyle>
<tk:DataGrid.CellStyle>
<Style TargetType="{x:Type tk:DataGridCell}">
<Setter Property="Focusable" Value="false"/>
</Style>
</tk:DataGrid.CellStyle>
</tk:DataGrid>
きれいな方法は、行とセルのスタイルをオーバーライドすることです
<DataGrid.Resources>
<ResourceDictionary>
<Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</DataGrid.Resources>
IsHitTestVisible="False"
をDataGrid
定義に追加するだけです。
DataGridの行の選択を完全に無効にするには、次の操作を実行できます。
<DataGrid>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
</DataGrid.RowStyle>
<!--Other DataGrid items-->
</DataGrid>
これは、<Setter Property="IsEnabled" Value="False"/>
前述の手法を実行すると、行のスタイルが変更されるためです。また、右クリックしてもコンテキストメニューが表示されることを無効にしません。
最後に、「 IsHitTestVisible 」を「False」に設定すると、編集を含め、行とのall対話が無効になることに注意することが重要です。 。
ただし、選択したときに行のスタイルを変更するだけの場合は、答えを表示してください here 。
上記のすべては、簡単にハッキングするための良いアイデアです。しかし、彼らは求められていることを正確に行っていません。他の答えは、ユーザーが選択したものを選択解除する方法、またはユーザーが選択したものを隠す方法を教えています。
しかし、これらの答えが与えられる理由は理解しています。実際のソリューションを提供するのは簡単ではありません。
実際の解決策は、そもそも選択を防ぐことです。これは簡単ではありませんが、いくつかの簡単な手順で実行できます。
回答1. Expression Blendでスタイルをコピーする必要があります(または、スタイルのコピーをどこかに見つけます)。 2.単一のItemPresenter設定を変更します。 ItemPresenterでIsHitTestVisible = "False"を設定するだけで十分です。
さらに詳細が必要な場合、またはこれを行うための詳細なウォークスルーが必要な場合は、私のブログ投稿を参照してください。
Sonic Soul here が指摘したように、vikyのソリューションは実際には機能しません。
DataGridで選択を無効にする実際の作業コードは次のとおりです。
grid.SelectionChanged += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
grid.UnselectAll()));
これを行うために私が見つけた唯一の適切な方法は、DataGrid Row StyleのIsHitTestVisibleプロパティを無効にすることです。
名前に関係なく、クリックイベントは引き続き登録されます。スクロールも無効にする場合を除き、DataGrid全体でこのプロパティを変更しないでください。
これを行うクリーンな方法は、静的リソースの新しいスタイルを使用することです(必要に応じて他のセッターをコピーします)
<Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
それをDataGridにバインドします
<DataGrid
RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
<!-- Contents -->
</DataGrid>
別の色を使用している場合:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="RowBackground" Value="#badeee"/>
<Setter Property="AlternationCount" Value="2" />
<Setter Property="AlternatingRowBackground" Value="#92cce5"/>
</Style>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="#badeee"></Setter>
<Setter Property="BorderBrush" Value="#badeee"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="#92cce5"></Setter>
<Setter Property="BorderBrush" Value="#92cce5"></Setter>
</Trigger>
</Style.Triggers>
</Style>
別の簡単な方法は、IsSelectedトリガーを使用して選択スタイルを透明に変更することです。
他の誰かが同じ問題に直面している場合、彼らはそれが役立つと思うかもしれません。
データグリッドのいくつかの行を無効にする必要がありましたが、同時にそれらの矢印キーのナビゲーションを許可しました。これが、「IsEnabled」プロパティを制御する代わりに「IsHitTestVisible」に切り替える必要があった理由です。そのため、上記の「IsEnable」プロパティに切り替えるソリューションを採用できませんでした。
この問題を解決する方法を次に示します。 DataGridRowの新しい添付プロパティ(RowEnable)を作成しました。この添付プロパティをviewmodelプロパティにバインドして、「仮想」の有効化と無効化を制御できます。また、同じviewmodelプロパティに基づいて 'IsHitTestVisible'をfalseに設定するDataGridCellの新しいスタイルを作成しました。したがって、マウス/キーボードは表示できますが、セル/列は表示できない行のように考えてください。つまり、新しい添付プロパティ(RowEnabled)に基づいて行をスタイル設定して、無効/有効に見えるようになりました。同時に、実質的に無効になっているこれらの行のツールチップを表示できます。
ソリューションの背後にあるコードが必要でした。これは私のために働く:
controlGrid.SelectedCellsChanged += (sender, e) =>
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render, new Action(() =>
controlGrid.UnselectAll()));
controlGrid.Columns.Clear();
時々ちらつくので、BackgroundPropertyも透明に設定されます。
Style dataGridCellStyle = new Style(typeof(DataGridCell));
Setter newSetterCell = new Setter(DataGridCell.BackgroundProperty, Brushes.Transparent);
dataGridCellStyle.Setters.Add(newSetterCell);
controlGrid.CellStyle = dataGridCellStyle;