5

画像のリストにバインドされた非常に単純な WPF データグリッド。仕切り (またはメイン ウィンドウ自体) を使用して列のサイズを変更すると、CPU は 100% になり、アプリは配置/サイズ変更の無限ループに入り、ウィンドウの内容が前後にジャンプし、ユーザー入力が処理されなくなります (ロックされます)。

データグリッドは次のように定義されます。

    <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Image 1" Width="40*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding ImagePath}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="EmptyText" />
        </DataGrid.Columns>
    </DataGrid>

私が試したこと:

  • DataGrid を継承し、グリッドの Arrange/Measure をオーバーライドします。
  • ウィンドウの配置/測定をオーバーライドします。
  • グリッドのスクロールバーを微調整し、それらをオフにして、さまざまなオプションを設定します。

私ができないこと:

  • .Net 4.5 へのアップグレードは、このプロジェクトのオプションではありません。
  • 列を削除すると、グリッドにポイントがなくなります。

.Net 4.0 でこの動作を回避する方法はありますか? そうでない場合は、グリッドの代わりに別のものを使用するなどの回避策を検討する必要がありますが、スタイリングに何年も費やしており、その作業を失いたくありません.

前もって感謝します

4

2 に答える 2

1

私は同じ問題に直面していましたが、何時間も苦労した後、最終的に回避策を見つけました。

DataGrid の SizeChanged イベントにイベント ハンドラーを追加します。

<DataGrid SizeChanged="DataGrid_SizeChanged">

そして、これはイベント ハンドラのコードです。

private void DataGrid_SizeChanged(object a_sender, SizeChangedEventArgs a_args)
{
    try
    {
        DataGrid dataGrid = a_sender as DataGrid;
        if (dataGrid != null)
        {
            double widthDifference = Math.Abs(a_args.PreviousSize.Width - a_args.NewSize.Width);
            double heightDifference = Math.Abs(a_args.PreviousSize.Height - a_args.NewSize.Height);

            if ((widthDifference != 0 && widthDifference < 1) || (heightDifference != 0 && heightDifference < 1))
            {
                dataGrid.Measure(new Size(Math.Round(dataGrid.ActualWidth), Math.Round(dataGrid.ActualHeight)));
                dataGrid.InvalidateMeasure();
            }
        }
    }
    catch (Exception) { }
}

これが良い解決策かどうかはわかりませんが、これが私にとって唯一うまくいったことです。

于 2015-07-21T10:56:20.450 に答える
0

いつものように、尋ねる行為で何かをもう一度調べたところ、使用可能な回避策が得られました。

以下のように、スクロール バーが常に表示されるようにデータグリッドを変更します。

        <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
于 2013-05-06T15:04:31.460 に答える