2010-06-21 68 views
1

全部,WPF佈局問題...如何滾動和自動調整內容大小?

我來自主要的ASP.NET背景,但也有Windows窗體的使用經驗。我正在嘗試學習如何佈局我的WPF應用程序。我有以下代碼:

<Grid> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="40" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="40" /> 
    </Grid.RowDefinitions> 

    <Button Grid.Row="0" Width="80" Content="Do Something" 
      HorizontalAlignment="Right" Margin="5" /> 

    <DataGrid Grid.Row="1" Name="dgGrid" AutoGenerateColumns="True" /> 

    <Button Grid.Row="2" Width="80" Content="Do Something Else" 
      HorizontalAlignment="Right" Margin="5" /> 

</Grid> 

在DataGrid短,頂部和底部排在哪裏,我期望......在與中心行窗口的頂部和底部佔用的其餘可見的空間。但是,當DataGrid太長時,最下面一行將被強制關閉。有沒有辦法讓DataGrid滾動時太長,以適應可見空間?

將中心行的高度設置爲固定值會導致DataGrid滾動,但我希望高度在窗口大小調整時爲動態。

任何幫助表示讚賞...

感謝, 婁

回答

0

嘗試的ScrollViewer:

<ScrollViewer Grid.Row="1"> 
    <DataGrid Name="dgGrid" AutoGenerateColumns="True" /> 
</ScrollViewer> 
0

我不是100%肯定,我跟蹤你的問題,但如果我以下是一些建議:

  • 當窗體大小調整時,按鈕消失,因爲t他的形式減少到可見區域以下。您可以通過在窗口中添加一個「MinHeight」來限制這種情況,如:MinHeight =「240」。這將防止用戶將表格縮小到低於閾值並使控件「消失」。
  • 設置行的最小高度,以便它們始終可見並且不會消失(只要它大於固定行的高度[80 +中間行高度]建議:

    <Grid.RowDefinitions> 
        <RowDefinition Height="40" MinHeight="40" /> 
        <RowDefinition Height="*" MinHeight="120" /> 
        <RowDefinition Height="40" MinHeight="40" /> 
    </Grid.RowDefinitions> 
    
  • 數據網格可以自動取得滾動條,除非該屬性的被改變,但你可能會仔細檢查VerticalScrollBarVisibility="Auto"

0

(對不起,還不能發表評論...)

我的問題不是最低高度,而是最大高度。我不希望DataGrid擴展到可見區域之外,但它確實如此。如果我在中心行上明確設置了高度,則DataGrid的滾動會按照預期進行,但如果我使用「*」作爲高度,DataGrid將擴展到可見區域之外。因此,如果「=」表示窗口,這裏是我遇到的表示......

=================================== 
= ROW 0 - Button     = 
= _______________________________ = 
= ROW 1 - DataGrid    = 
=  --------------------------- = 
=  --------------------------- = 
=  --------------------------- = 
=  --------------------------- = 
=================================== 
     --------------------------- 
     --------------------------- 
     --------------------------- 
     --------------------------- 
    _______________________________ 
    ROW 2 - Button 

的ScrollViewer也不能工作。

謝謝!

+0

你是誰張貼的問題同 「盧」?如果是這樣,你創建了第二個帳戶,這就是爲什麼你不能編輯或評論你的問題。聯繫[email protected]關於合併帳戶。你需要註冊一個OpenID。 – ChrisF 2010-06-22 19:24:28

+0

謝謝。我知道。我匿名創建了這個問題。那是個錯誤。 – Lou 2010-06-22 19:42:33

+0

關於我的問題的任何提示?我的DataGrid正在擴展到可見區域之外,我不知道如何將它限制在可見區域並滾動來進行滾動(設置不隨窗口大小擴展的固定高度)。任何幫助表示讚賞。 – Lou 2010-06-24 02:36:26

0

Lou,

我也在努力解決這個問題。有一種解決方案,但在Windows XP上看起來效果不好。訣竅是通過創建一個空的佔位符行來爲DataGrid預留空間。將您的DataGrid移動到佈局網格外部並設置邊距,如下所示。

<Grid SizeChanged="Grid_SizeChanged"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="40" /> 
     <RowDefinition Name="DetailGridRow" Height="*" /> 
     <RowDefinition Height="40" /> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Width="80" Content="Do Something" Margin="5" /> 
    <Button Grid.Row="2" Width="80" Content="Do Something Else" Margin="5" /> 
</Grid> 
<DataGrid Margin="0,40,0,40" Name="dgGrid" AutoGenerateColumns="True" /> 

現在將這個SizeChanged處理程序放在類的後面。

/// <summary> 
/// In order to prevent the datagrid from growing vertically the size is set to an empty 
/// Grid row's size. 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Grid layoutGrid = sender as Grid; 
    double marginWidth = (layoutGrid.Margin.Left + layoutGrid.Margin.Right); 
    double marginHeight = (layoutGrid.Margin.Top + layoutGrid.Margin.Bottom); 
    double minHeight = dgGrid.MinHeight; 

    if (e.HeightChanged) 
     dgGrid.Height = DetailGridRow.ActualHeight > minHeight ? 
     DetailGridRow.ActualHeight - marginHeight : minHeight - marginHeight; 
    if (e.WidthChanged) 
     dgGrid.Width = layoutGrid.ActualWidth - marginWidth; 

    e.Handled = false; 
} 

正如我前面提到的,這種技術在Windows XP上有問題。我遇到的問題是列寬度全部搞亂,導致網格不可用,除非您找到「魔術」列並雙擊它的列分隔符,這會將所有列寬恢復爲正確的大小。我仍在制定解決方案。

1

您可以使用底座面板來解決此問題。在停靠面板中,添加第一個按鈕並將其停靠在頂部。然後添加第二個按鈕並將其停靠在底部。現在添加數據網格。確保DockPanel LastChildFill爲true。這會給你你想要的結果。我沒有測試代碼,所以你可能需要一點調整,但它應該工作。

<DockPanel LastChildFill="True"> 
<Button DockPanel.Dock="Top" Width="80" Content="Do Something" 
     HorizontalAlignment="Right" Margin="5" /> 

<Button DockPanel.Dock="Bottom" Width="80" Content="Do Something Else" 
     HorizontalAlignment="Right" Margin="5" />