2017-08-23 10 views
0

以下のDataGridは、細い列から始まり、すぐ下のXAMLの定義された幅に急速に飛び出します。WPF XAML奇妙な列幅の振る舞い

最初の動作をせずに、最初から説明したように列の幅をどのようにすることができますか?

  <DataGrid ItemsSource="{Binding Orders}" Name="_dataGridOrders" AutoGenerateColumns="False"> 

       <DataGrid.Columns> 

        <DataGridTextColumn Header="Order Number" Binding="{Binding OrderNumber}" Width="3.3*"/> 
        <DataGridTextColumn Header="Numeric ID" Binding="{Binding NumericId}" Width="3*"/> 
        <DataGridTextColumn Header="Ship To" Binding="{Binding ShipTo}" Width="4*"/> 
        <DataGridTextColumn Header="Order Date" Binding="{Binding OrderDate}" Width="5*"/> 
        <DataGridTextColumn Header="Calculated Weight" Binding="{Binding CalculatedWeight}" Width="4*"/> 
        <DataGridTextColumn Header="# Items" Binding="{Binding ItemsNumber}" Width="3*"/> 
        <DataGridTextColumn Header="Tracking" Binding="{Binding TrackingNumbers}" Width="6*"/> 

       </DataGrid.Columns> 

      </DataGrid> 
+0

コンテキストが必要...レイアウトプロセスのように、使用可能な領域を再設定する必要があります。しかし、問題を再現するために必要でないすべてのプロパティを削除してください。あなたの 'ui:MultiSelectionSyncHandler.ItemFilter'のようなものは何も知らず、問題に寄与しない場合はわかりません。しかし、そうした場合は、コードを含める必要があります。 – grek40

+0

ありがとう! ...すべてを取り除き、幅を定数に変更しました...それはもっともっと好きです...しかし、定数は必要ありません!ナンバー・クランチは頼むにはあまりにも多いと思うし、それは私のコンピュータでもありません! – JohnG79

+1

コンストラクタの代わりに 'Loaded'イベントでデータコンテキストを設定したときや、多くの項目が追加されたときに、リモートから似たようなものが得られました。 RowHeaderは、最初の行が表示された後にのみスペースを使用し、アイテムが可視領域を超えてスクロールバーを表示し、左にいくらかスペースを置くことに関連しています。列の使用可能なサイズの変更があるため、両方のものが再レイアウトを強制しますが、すべての列が左に折りたたまれて開始されるものはありません。 DataGridの親コンテナを表示して、レイアウト動作を把握する必要があります。 – grek40

答えて

1

あなたは、関連するすべてのコードを提供していないので、私はここに少し推測していますが、私は問題が何であるかを知って、かなり特定感じます。

DataGridが予定されたサイズに拡大する細い列で開始するのは、グリッド上でマルチプレイレイアウトパスを通過するためです。これは、ウィンドウが表示された後にウィンドウサイズを変更していることが原因です。これを行う理由は、ウィンドウサイズをアプリケーションの最後の実行サイズに戻すためです。ウィンドウコンストラクタでこれを行うと、あなたが報告するちらつきが得られます。これを修正するには、サイズ変更コードをウィンドウ初期化イベントハンドラに移動します。だからではなく、本の

...

public MainWindow() 
    { 
     InitializeComponent(); 
     Rect r = App.Settings.MainWindowBounds; 
     Rect desktop = new Rect(SystemParameters.VirtualScreenLeft, SystemParameters.VirtualScreenTop, SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight); 
     if (desktop.Contains(r) && r.Width > 0.0 && r.Height > 0.0) 
     { 
      Left = r.Left; 
      Top = r.Top; 
      Height = r.Height; 
      Width = r.Width; 
     } 
    } 

これを行います...

private void Window_Initialized(object sender, RoutedEventArgs e) 
    { 
     Rect r = App.Settings.MainWindowBounds; 
     Rect desktop = new Rect(SystemParameters.VirtualScreenLeft, SystemParameters.VirtualScreenTop, SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight); 
     if (desktop.Contains(r) && r.Width > 0.0 && r.Height > 0.0) 
     { 
      Left = r.Left; 
      Top = r.Top; 
      Height = r.Height; 
      Width = r.Width; 
     } 
    } 

これは、ウィンドウ初期化ハンドラがレイアウトパスの前に呼び出されているので、はるかに効率的なアプローチです。