2014-01-23 86 views
2

我有一個數據網格,這些數據網格出現或消失取決於某些用戶首選項。 該數據網格是包含這些網格中的一些網格的堆疊面板的一部分。 問題是,當用戶隱藏一些行時,數據網格高度不會縮小。這隻發生在windows xp上,而不是Windows 7上的網格收縮如預期。當行摺疊時,DataGrid不會調整大小

這裏是一個小例子,顯示了問題:

的XAML:

<Window x:Class="TestDataGridResize.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid> 
    <StackPanel Orientation="Vertical"> 
     <Button Content="Hide some rows" Click="Button_Click"/> 
     <DataGrid Name="dataGrid" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn IsReadOnly="True" Binding="{Binding Name}" Header="Name" /> 
      </DataGrid.Columns> 
      <DataGrid.RowStyle> 
       <Style TargetType="{x:Type DataGridRow}"> 
        <Setter Property="Visibility" Value="{Binding Visibility}"/> 
       </Style> 
      </DataGrid.RowStyle> 
     </DataGrid> 
     <TextBlock Text="THE END" Background="AliceBlue" TextAlignment="Center"/> 
    </StackPanel> 

</Grid> 

其背後的代碼:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<Element> elements = new ObservableCollection<Element>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     this.dataGrid.ItemsSource = this.elements; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 5; i++) 
      this.elements[i].Visibility = System.Windows.Visibility.Collapsed; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 10; i++) 
      this.elements.Add(new Element("Element " + i)); 
    } 
} 

public class Element : INotifyPropertyChanged 
{ 
    private static PropertyChangedEventArgs VisibilityChanged = new PropertyChangedEventArgs("Visibility"); 

    private string name; 
    public string Name 
    { 
     get { return this.name; } 
     set { this.name = value; } 
    } 

    private Visibility visibility; 
    public Visibility Visibility 
    { 
     get { return this.visibility; } 
     set 
     { 
      this.visibility = value; 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, VisibilityChanged); 
     } 
    } 

    public Element(string name) 
    { 
     this.name = name; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

目標框架是4.0。 任何幫助將不勝感激。

回答

0

嘗試使用Grid安排的控制,而不是StackPanel

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Content="Hide some rows" Click="Button_Click"/> 
    <DataGrid Grid.Row="1" Name="dataGrid" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn IsReadOnly="True" Binding="{Binding Name}" Header="Name" /> 
     </DataGrid.Columns> 
     <DataGrid.RowStyle> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="Visibility" Value="{Binding Visibility}"/> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
    <TextBlock Grid.Row="2" Text="THE END" Background="AliceBlue" TextAlignment="Center"/> 
</Grid> 
+0

此修復該問題。非常感謝你。 – amnesyc

+0

知道使用堆棧面板有什麼問題仍然很有趣... – amnesyc

+0

StackPanel無法調整其內容元素的大小...... Grid就是這樣做的。 – Sheridan

相關問題