2017-08-23 1 views
0

Das folgende DataGrid beginnt mit dünnen Spalten und springt dann schnell zu den definierten Breiten in der XAML-Datei.WPF XAML Seltsames Spaltenbreitenverhalten

Wie können wir die Spaltenbreiten wie beschrieben von Anfang an ohne das anfängliche Verhalten machen?

  <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

Brauchen Sie etwas Kontext ... klingt wie der Layout-Prozess entscheidet über den verfügbaren Platz zu füllen. Bitte entfernen Sie jedoch alle Eigenschaften, die nicht benötigt werden, um das Problem zu reproduzieren ... wir wissen nichts von Dingen wie Ihrem 'ui: MultiSelectionSyncHandler.ItemFilter' und wenn es nicht zu dem Problem beiträgt, das wir nicht wissen wollen. Aber wenn dies der Fall ist, müssen Sie den Code einfügen. – grek40

+0

Danke! ... strippte alles aus ... und änderte die Breite in Konstanten ... es mag das viel mehr ... aber ich will keine Konstanten! Ich denke, das Zahlenknacken ist zu viel verlangt und es wird auch nicht mein Computer sein! – JohnG79

+1

Ich bekomme etwas entfernt ähnliches (nicht wirklich das, was Sie beschreiben), wenn ich den Datenkontext im Ereignis 'Loaded' anstelle des Konstruktors oder wenn viele Elemente hinzugefügt werden. Es bezieht sich auf den RowHeader, der sein Leerzeichen erst dann verwendet, wenn die erste Zeile sichtbar wird und die Bildlaufleiste erscheint, wenn Elemente den sichtbaren Bereich überschreiten und etwas Platz auf der linken Seite einnehmen. Beide Dinge erzwingen ein Re-Layout, da die verfügbare Größe für die Spalten geändert wird, aber keine von ihnen beginnt mit allen Spalten, die nach links kollabiert sind. Sie müssen die übergeordneten Container des DataGrids anzeigen, damit wir ihr Layoutverhalten kennen. – grek40

Antwort

1

Ich vermute, ein bisschen hier, weil Sie nicht alle relevanten Code zur Verfügung gestellt haben, aber ich fühle mich ziemlich sicher, dass ich weiß, was das Problem ist.

Der Grund dafür, dass das DataGrid mit dünnen Spalten beginnt, die auf die erwartete Größe erweitert werden, besteht darin, dass Sie mehrere Layoutdurchläufe im Raster durchlaufen. Dies liegt wahrscheinlich daran, dass Sie die Fenstergröße ändern, nachdem das Fenster sichtbar wird. Der Grund dafür ist, dass Sie die Fenstergröße auf die Größe der letzten Ausführung der App zurücksetzen. Wenn Sie dies im Fensterkonstruktor tun, erhalten Sie das Flackern, das Sie melden. Um dies zu beheben, verschieben Sie den Größenänderungscode in den im Fenster initialisierten Ereignishandler.

Anstatt also diese ...

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; 
     } 
    } 

dies tun ...

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; 
     } 
    } 

Dies ist ein wesentlich effizienter Ansatz, da das Fenster initialisiert Handler vor dem Layout Pass genannt wird.