1

ウィンドウ内で拡大および縮小する必要がある 2D グリッドを必要とする WPF プロジェクトに取り組んでいます。これを行うために、DataGrid 内の ItemsPanels を UniformGrids に置き換えました。これを行うと、コントロールが正しく伸縮します。

残念ながら、何らかの理由で、これにより 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));
        }
    }
}
4

1 に答える 1

1

修正は非常に簡単でした。DataGridCellPanel を反映した後、次の静的コンストラクターがあることに気付きました。

static DataGridCellsPanel()
        {
            KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(DataGridCellsPanel), new FrameworkPropertyMetadata((object)KeyboardNavigationMode.Local));
        }

必要なのは、UniformGrid を拡張してその静的コンストラクターを追加するか、添付プロパティ KeyboardNavigation.TabNavigation="Local" を DataGridRow スタイルの UniformGrid に追加することだけでした。

        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <UniformGrid KeyboardNavigation.TabNavigation="Local" IsItemsHost="True" Rows="1"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>
于 2017-03-23T13:26:00.320 に答える