2013-07-19 78 views
15

我面臨一個問題,設置以下XAML佈局組合:自動高度與MaxHeight

RowHeightAuto.xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="GridMaxHeight.RowHeightAuto" 
    Title="RowHeightAuto" WindowState="Maximized"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition Height="Auto" MaxHeight="200" /> 
    </Grid.RowDefinitions> 

    <StackPanel Background="LightGray" Grid.Row="0"></StackPanel> 
    <DataGrid Name="DataGrid1" Grid.Row="1" /> 
</Grid> 

DataGrid1控件未示出與任何滾動定義了很多列和行。 當我將Height =「Auto」替換爲Height =「*」時,所有工作都會找到,而水平和垂直滾動條會像預期的那樣出現。

此外,它可以直接在DataGrid1上聲明MaxHeight,但這不是我想要的。

這是一個錯誤,childcontrol忽略設置Height =「Auto」時的maxheight還是我可以合理地做出錯誤?同樣的行爲可以用ListBox/ListView等等,還有像ComponentOne,Telerik這樣的第三方控件來重現...

如果這是一個錯誤 - 你知道一個解決方法或有其他提示嗎?

以下是我如何設置DataGrid的ItemsSource的代碼。 RowHeightAuto.xaml.cs

public partial class RowHeightAuto : Window 
{ 
    private readonly DateTime _start; 

    public RowHeightAuto() 
    { 
     InitializeComponent(); 

     DataGrid1.ItemsSource = GetTestData(); 

     _start = DateTime.Now; 
     Dispatcher.BeginInvoke(new Action(() => MessageBox.Show((DateTime.Now - _start).TotalSeconds.ToString(CultureInfo.InvariantCulture))), DispatcherPriority.ContextIdle, null); 
    } 

    public static List<TestData> GetTestData() 
    { 
     const int maxCols = 501; 
     const int maxRows = 300; 

     var testDatas = new List<TestData>(maxRows); 
     for (int i = 0; i < maxRows; i++) 
      testDatas.Add(new TestData()); 

     for (int i = 0; i < maxCols; i++) 
     { 
      string propName = string.Format("Property{0}", AddLeadingZeros(i)); 

      for (int j = 0; j < maxRows; j++) 
       testDatas[j][propName] = propName; 
     } 

     return testDatas; 
    } 

    private static string AddLeadingZeros(int val) 
    { 
     return val.ToString(CultureInfo.InvariantCulture).PadLeft(3, '0'); 
    } 
} 

public class TestData 
{ 
    public object this[string propertyName] 
    { 
     get 
     { 
      var myType = GetType(); 
      var myPropInfo = myType.GetProperty(propertyName); 
      return myPropInfo.GetValue(this); 
     } 
     set 
     { 
      var myType = GetType(); 
      var myPropInfo = myType.GetProperty(propertyName); 
      myPropInfo.SetValue(this, value, null); 

     } 
    } 

    public string Property000 { get; set; } 
    public string Property001 { get; set; } 
    public string Property002 { get; set; } 
    public string Property003 { get; set; } 
    ... 
    public string Property498 { get; set; } 
    public string Property499 { get; set; } 
    public string Property500 { get; set; } 

} 
+0

對於體面格式化和記錄的第一個問題+1。歡迎來到SO :) – Viv

+0

而不是你可以寫'string.Format(「Property {0:000}」,i)'而不是調用你的'AddLeadingZeros'方法。 – Clemens

+0

@ Viv:謝謝。 :) @克萊門斯:感謝您的意見。我是一個字符串格式的noob。 :) –

回答

7

這與您所說的完全相同。

你之所以沒有看到Scrollbar的是因爲即使Grid剪輯的DataGrid,它只是一個片段,該DataGridActualHeight是高度如果允許的話,以顯示它的所有的孩子會得到。您因此看不到它是滾動條的。 ActualHeight是如此之大,它可以通過Grid上的Height="Auto"獲得所需的所有空間。 我不會將這個錯誤稱爲個人錯誤的原因是因爲您可能希望這種行爲,如果您想玩 GridClipToBounds屬性對於某些動畫,並且這是您想要的行爲。 想到這裏,我真的認爲我會在「不可取功能」方面稱這是一個錯誤也比「不正確的輸出」

爲了讓您尋找的行爲,

  • 應用MaxHeightDataGrid或使用電網RowDefinition.Height="*" < - 既作爲你提到的(不知道爲什麼你說這是不是你想要做什麼?)
  • 或者你也可以在DataGrid
使用

像 -

<DataGrid Name="DataGrid1" 
      Grid.Row="1" 
      Height="{Binding RelativeSource={RelativeSource FindAncestor, 
          AncestorType={x:Type Grid}}, 
          Path=RowDefinitions[1].ActualHeight}"> 

對於這樣的問題Snoop是你的朋友。您可以使用Snoop輕鬆檢查此行爲並瞭解爲什麼滾動條未顯示,因爲您在DataGrid上檢查了ActualHeight,並且看到它爲子控件分配了更多高度。

+0

不真的明白爲什麼會發生這種情況,在我的佈局中,我清楚地說明我只想要MaxHeight爲200.您是否可以解釋一下爲什麼有人會在說明MaxHeight時想要一個完全尺寸的子元素? 也許這就是爲什麼即使水平滾動條不顯示,這絕對沒有意義給我。 –

+0

@RandRandom但是你也在說'Height =「Auto」,這意味着「佔用你想要的所有空間」。這只是我的意見btw。你可以在MSDN上提出它作爲bug,並詢問爲什麼指定Auto不會強制子控件尊重'Grid.RowDefinition'上的'MaxHeight'。對我來說,如果你指定「*」作爲高度,那麼允許孩子從「父母」中獲得任何可用空間,這恰好受到MaxHeight的限制,因此輸出就是你所期望的。 – Viv

+0

@RandRandom ..contd。然而,當你設置'Height =「Auto」'時,會出現一個不匹配的情況,一方面,網格的行必須在MaxHeight的ActualHeight中只取200,而允許孩子通過Auto for Height當網格的行本身符合給定的最大值200時,它們都滿足了讓孩子獲得所需空間的要求。 – Viv