2012-06-12 17 views
6

Tôi có một DataGrid WPF tăng chiều cao khi tôi thêm dữ liệu vào nó sẽ không vừa với chiều cao ban đầu của nó. Tôi không muốn chiều cao thay đổi trừ khi người dùng tăng kích thước Cửa sổ. Có cách nào để dừng tự động thay đổi kích thước này không?Chiều cao của WPF DataGrid tăng khi dữ liệu được thêm

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" 
     SizeToContent="WidthAndHeight"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Top" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 

    public partial class MainWindow : Window 
    { 
     MyList myList = new MyList(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      wordsDataGrid.DataContext = myList; 
      for (int i = 0; i < 100; ++i) 
      { 
       myList.AddOne("blah blah"); 
      } 
     } 
    } 

    public class MyList : ObservableCollection<AClass> 
    { 
     public MyList() { } 

     public void AddOne(string aString) 
     { 
      base.Add(new AClass(aString)); 
     } 
    } 

    public class AClass 
    { 
     public string AString { get; set; } 

     public AClass(string aString) 
     { 
      AString = aString; 
     } 
    } 
+0

Đặt nó trong một 'RowDefinition' có' Chiều cao = "*" ' –

+0

tôi đã cố gắng @Meleak này nhưng nó nó làm cho không có sự khác biệt. – Ian

Trả lời

4

Nếu tôi không hiểu sai, bạn muốn DataGrid của bạn ở mức cao nhất, với một số khoảng trống bên dưới DataGrid trong Windows ... Sau đó, khi thay đổi kích thước cửa sổ, DataGrid sẽ thay đổi kích thước của nó.

Thêm một hàng nữa vào lưới và xác định MinHeight của hàng đó. Sau đó thiết lập DataGrid là VerticalAlignment = Stretch. Đồng thời đặt kích thước chiều cao mặc định cho Cửa sổ.

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" Height="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition MinHeight="100"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0" VerticalAlignment="Stretch"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Stretch" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

Không hoàn toàn. Tôi muốn chiều cao của DataGrid là độc lập với bao nhiêu hàng nó chứa, để duy trì cùng chiều cao nó ở trong khung nhìn thiết kế. Người dùng có thể thay đổi kích thước của cửa sổ có thể, tùy thuộc vào RowDefinitions, thay đổi kích thước của hàng Grid.Trong trường hợp đó tôi muốn chiều cao của GridView phát triển với chiều cao lưới. – Ian

+0

Đoạn mã trên không phụ thuộc vào số lượng hàng chứa trong đó, DataGrid sẽ giữ cùng chiều cao cho đến khi người dùng thay đổi kích thước cửa sổ. The Row một (một trong những có chứa DataGrid) đang sử dụng còn lại Chiều cao còn lại trong cửa sổ. Nói bây giờ Window là 300, được sử dụng 100 ở hàng thứ 2, 200 sẽ sử dụng cho DataGrid. Khi người dùng thay đổi kích thước cửa sổ thành 500, 400 sẽ được sử dụng cho DataGrid ... Không có vấn đề bao nhiêu hàng DataGrid chứa, nó sẽ không tăng chiều cao. –

+0

Rất tiếc, có vẻ như tôi đã gặp lỗi khi tôi kiểm tra giải pháp của bạn lần đầu tiên. Điều này dường như không hoạt động. – Ian

0

Hãy thử sử dụng VerticalAlignment = Top ví dụ hoặc explicitely thiết lập Height tài sản cho một số giá trị.

This cũng có thể giúp ... đặt thẻ dữ liệu trong ngăn xếp và kiểm soát hành vi định cỡ của satckpanel.

+0

Cài đặt VerticalAlignment = "Top" không có tác dụng. Tôi không muốn đặt Chiều cao một cách rõ ràng bởi vì tôi muốn lưới phát triển khi kích thước Cửa sổ được tăng lên bởi người dùng. Tôi chỉ muốn chiều cao được như trước khi dữ liệu được thêm vào. Tôi không chắc chắn những thuộc tính để thiết lập trên một StackPanel kèm theo để đạt được những gì tôi muốn. – Ian

0

Nếu vấn đề là toàn bộ lưới phát triển (nhưng bạn hài lòng với các hàng riêng lẻ phát triển) thì: bảng điều khiển cha mẹ mà DataGrid nằm bên trong là gì? Thay đổi điều này có thể ảnh hưởng đến cách điều khiển thay đổi kích thước.

Ví dụ: StackPanel sẽ cho phép trẻ phát triển theo một hướng (hướng xếp chồng) và DockPanel sẽ giới hạn kích thước của phần tử "được lấp đầy" sang không gian có sẵn.

+0

Kích thước hàng không thay đổi. Tôi chỉ hiển thị văn bản. Tôi đã thử có DataGrid là con của Window, của một Grid và một DockPanel trong một Grid. Trong mọi trường hợp, DataGrid tăng lên nhiều hơn một chút so với mức cao của màn hình khi tôi thêm hàng. – Ian

1

này sẽ làm những gì bạn mong muốn:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="70"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <DataGrid Name="dgMain" AutoGenerateColumns="True"></DataGrid> 

    </Grid> 

cùng với điều này:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Foo foo; 
     List<Foo> foos = new List<Foo>(); 

     foo = new Foo() { Name = "Sjaak" }; 
     foos.Add(foo); 

     foo = new Foo() { Name = "Joepie" }; 
     foos.Add(foo); 

     dgMain.ItemsSource = foos; 

    } 
} 

public class Foo 
{ 
    public Foo() { } 

    public String Name { get; set; } 
} 

Bí quyết là ở tỷ lệ (chẵn) phân phối của chiều cao dòng bằng cách sử dụng "1 * "cho thuộc tính Độ cao của cả hai hàng. Bạn cũng có thể phân phối nó trong "cổ phiếu" khác bằng cách đặt một hàng Chiều cao thành "2 *", v.v.

1

Tôi đã gặp vấn đề tương tự và tôi đã sửa nó bằng cách xóa SizeToContent = "WidthAndHeight" trong định nghĩa Cửa sổ .

+0

Tôi đã làm những gì câu trả lời được chấp nhận được đề xuất nhưng không hoạt động mà không có điều này - rõ ràng nhưng dễ bỏ lỡ – stambikk

0
VerticalAlignment="Bottom" 

đã làm việc để giải quyết vấn đề tương tự chính xác này. Tôi cũng sử dụng

VerticalScrollBarVisibility="Auto"  
Các vấn đề liên quan