私は、ウィンドウ内で展開および縮小が必要な2Dグリッドを必要とするWPFプロジェクトに取り組んでいます。これを行うために、DataGrid内のItemsPanelsをUniformGridsに置き換えました。私がこれを行うと、コントロールは正確に伸縮します。WPF DataGrid DataGridRow override ItemsPanelがタブの順序を破る
これは、何らかの理由で、DataGrid内でタブの順序が壊れてしまいます。タブを押すと、次の列に右にジャンプするのではなく、行がドロップダウンします。タブが行の最後に当たったら、次の列の先頭に移動して、その行を続けます。左、右、上、下の矢印キーはすべて正常に機能しますが、影響を受けるのはタブ順序だけです。 DataGridRowスタイルを削除すると、タブの順序は自動的に修正されますが、行はウィンドウとともに展開されません。
この問題は、StackPanelも同じタブの現象を生成するため、UniformGridには分離されていないようです。
このタブの問題を修正するために、あるいは必要に応じてグリッドを拡張および縮小するための別の方法を、どのように見なければならないのですか?
例XAML:
<Window x:Class="SODatagridSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<UniformGrid IsItemsHost="True" Rows="1" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<DataGrid x:Name="datagrid" ItemsSource="{Binding Values}" SelectionMode="Extended" SelectionUnit="Cell" ColumnWidth="*" HeadersVisibility="None"
CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1"></UniformGrid>
</ItemsPanelTemplate>
</DataGrid.ItemsPanel>
</DataGrid>
</Grid>
</ScrollViewer>
サンプルコードの背後にある:
using System.ComponentModel;
using System.Data;
using System.Windows;
namespace SODatagridSample
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public DataTable Values
{
get { return _Values; }
set
{
_Values = value;
OnPropertyChanged(nameof(Values));
}
}
private DataTable _Values;
public MainWindow()
{
Values = new DataTable();
for (int i = 0; i < 15; i++)
Values.Columns.Add(i.ToString(), typeof(double));
for (int i = 0; i < 10; i++)
Values.Rows.Add(Values.NewRow());
for (int x = 0; x < 10; x++)
for (int y = 0; y < 15; y++)
Values.Rows[x][y] = x * 15 + y;
DataContext = this;
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}