2017-08-23 113 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從擴展到預期大小的細列開始的原因是,您正在通過網格上的multipe佈局傳遞。這很可能是由於您在窗口變得可見之後正在更改窗口大小。您可能會這樣做的原因是將窗口大小恢復爲應用程序上次執行的大小。如果你在窗口構造函數中這樣做,你會得到閃爍的報告。爲了解決這個問題,調整大小代碼到窗口初始化事件處理程序。

所以不是這個......

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

這是一種更有效的方法,因爲窗口初始化處理程序的佈局傳遞之前調用。