2010-01-21 87 views
1

UserControl我試圖用基本上奠定了像這樣的工作:然後WPF網格和DataGrid大小

<Grid> 
    <Grid.RowDefinitions> 
     <Row Height="*"/> 
     <Row Height="*"/> 
    </Grid.RowDefinitions> 
    <wpftoolkit:DataGrid x:Name="PrimaryGrid"/> <!-- ~10 rows --> 
    <Border> 
     <Grid> 
     <Grid.RowDefinitions> 
      <Row Height="*"/> 
      <Row Height="*"/> 
     </Grid.RowDefinitions> 
     <wpftoolkit:DataGrid x:Name="SecondaryGrid"/> <!-- ~2 rows --> 
     <wpftoolkit:DataGrid x:Name="OtherGrid"/> <!-- ~50 rows --> 
     </Grid> 
    </Border> 
</Grid> 

UserControl放在我的WindowGrid的最後一個成員,是唯一一個與Height="*"。我在DataGrid的尺寸方面遇到問題。

如果我在Window設置UserControlStretchVerticalAlignment,然後PrimaryGrid得到1/2高度UserControl的,每一兩個Border內得到1/4。無論每個行的行數是多少,它們的大小都是這樣,使OtherGrid的垂直空間太少,而其他行在滾動視圖內的非行空白。

如果我將VerticalAlignment設置爲Top,網格看上去與其內容大小相當一致,除了UserControl底部留有無法解釋的空白。我用探聽和RowDefinitionUserControl具有適當ActualHeight,但UserControl僅使用其一部分 - 80%左右。

我不介意我是否修復Stretch情況下(我如何讓DataGrid不拉伸比它的行數?大)或Top情況下(我如何讓UserControl使用它擁有的所有空間?提供給它)

回答

0

嗯,這就是我最終的結果。它主要是從佈局的角度來做我想要的。多一點的代碼比我想要的還要多,但是哦。

在我DataContextChanged僅事件處理程序:

//for each grid 
_reportObserver = new PropertyObserver<ItemCollection>(PrimaryGrid.Items) 
    .RegisterHandler(c => c.Count, c => UpdateMaxHeight(PrimaryGrid)); 
UpdateMaxHeight(PrimaryGrid); 

PropertyObserver是http://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-avoid-messy-propertychanged-event-handling/

//Lots of ugly hard-coding  
private void UpdateMaxHeight(DataGrid grid) 
{ 
    double header_height = grid.ColumnHeaderHeight; 
    if (double.IsNaN(header_height)) 
     header_height = 22; 
    double margin_height = grid.Margin.Bottom + grid.Margin.Top; 
    grid.MaxHeight = header_height + margin_height + grid.Items.Count * (grid.RowHeight+2); 

    UpdateLayout(); //this is key for changes to number of items at runtime 
} 

即使設置DataGrid的MaxHeight後,事情還難看,所以我必須設置在最大高度RowDefinition也是如此。但是,這仍然是不對的,導致上面的margin_height增加。

<RowDefinition Height="*" MaxHeight="{Binding ElementName=PrimaryGrid, Path=MaxHeight}"/> 

在某些時候,我會考慮我在我醜陋的最大高度代碼中可選擇顯示的行詳細信息。

至於Top vs Stretch,我結束了其他原因在ListView中的用戶控件。現在一切都很好。

再次感謝您看我的問題。

3

摘要:使用你的用戶控件裏面的行高度Stretch的用戶控件,但Auto(而不是*)。

說明:「自動」 means:根據需要(這是你想要的)一樣多的空間,而「*」表示:所有可用空間的比例份額(導致1/2,1/4 ,1/4分佈)。

既然你想要的用戶控件使用所有可用空間,Stretch是正確的選項(這意味着正是)。如果您希望此行佔據剩餘的可用空間,請將的一個的UserControl內部的UserControl重新設置回「*」。

+0

我會給它一個鏡頭,但上次我嘗試Auto時,OtherGrid展開窗口的底部,沒有滾動條。 – Thomas 2010-01-21 22:39:50

+0

是的,所有的汽車絕對不好。 使兩個網格自動,*有點作品,直到我縮小窗口。然後PrimaryGrid不縮小,邊界逐漸消失。也許我可以給他們一個與ActualHeight比例相關的maxheight。但那似乎是如此沒有必要。 我想我想將DataGrid的MaxHeight綁定到它的ScrollableHeight,但這似乎不起作用。 – Thomas 2010-01-21 22:51:46

+0

作爲一種替代方法:如何使用Auto並將整個UserControl放入ScrollViewer中?這樣,每個DataGrid應該可以獲得所需的空間,並且可以使用(全局)滾動條來滾動。 – Heinzi 2010-01-21 23:41:54

1

這是一個常見的問題,你真正想要的是2種完全不同的佈局行爲:自動調整大小時,有足夠的空間爲所有三個,*施膠時沒有。一些快速修復,你可以嘗試使用限制:

  • 自動調整大小(前面已經提到)
  • DockPanel中每一組對接=頂部 - 這將產生類似的效果,以VerticalAlignment =頂部,但最後的DataGrid(只有1)將伸出來填補剩餘的空間。如果第一個或第二個佔用更多空間而不是存在,也是不好的,因爲他們會將其他人推出。
  • 將MinHeight/MaxHeight與您的DataGrid上的其他2個更改之一結合使用,以防止它們失控。這放棄了一些自動佈局的靈活性,以確保一切都顯示出來。

除了這些,你可以嘗試更復雜的東西,如創建一個自定義面板(或找到一個別人已經取得),或創建一個可以計算出合適的高度(或了minHeight,MaxHeight)一MultiValueConverter設置每個DG或根據UC的高度和每個DG的高度來劃分。

+0

謝謝你的想法。投了票。 – Thomas 2010-01-21 23:20:04

0

只是想跟進這個問題。隨着時間的推移,我上面提供的解決方案並沒有達到用戶的期望。我現在已經改爲方案是這樣的:

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <Grid> 
     <!-- row definitions --> 
     <KentBoogart's Resizer ResizeDirection="South"> 
     <DataGrid/> 
     </kb:Resizer> 
     <kb:Resizer ResizeDirection="South"> 
     <DataGrid/> 
     </kb:Resizer> 
    </Grid> 
</ScrollViewer> 

在我用這個成語另一個地方,我已經設置了調整器具有綁定到ScrollViewer中的一個的ActualHeight到MaxHeight防止其外出的控制。這個設計可能會讓整個滾動條和DataGrid中的滾動條有點混淆,但是邊框和邊距很好,但這並不算太壞。