2011-06-29 73 views
3

我無法調整WPF控件的大小(我將在此示例中使用Grid控件)與WindowClient區域的大小有關。我意識到Grid默認會自動填充所有可用空間,但是我需要手動設置GridWidth,以便我可以將其從另一個控件綁定到它(如果DataGrid的其中一列Width的設置爲Star if它有什麼區別)。填充內容以填充窗口的「客戶區」

請考慮下面的XAML:

<Window x:Class="TestApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="768" Width="1024" 
     x:Name="mainWindow"> 

    <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"> 
     <Grid x:Name="testGrid" Background="DarkGray"> 
     </Grid> 
    </ScrollViewer> 

</Window> 

而下面的代碼隱藏:

using System.Windows; 

namespace TestApplication 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      testGrid.Width = mainWindow.Width - (SystemParameters.BorderWidth * 2); 
     } 
    } 
} 

當運行這個簡單的應用程序,該Grid的寬度比Client面積稍大的Window,導致顯示Horizontal Scroll Bar。如果SystemParameters.BorderWidth沒有準確計算出Window邊框的寬度,會發生什麼?

根據最新的MSDN文檔,SystemParameters.BorderWidth獲取確定非最小化窗口的非客戶端區域邊界寬度的度量標準。

回答

1

在經歷了這個大小問題很長一段時間後,我終於找到了一個優雅的解決方案。儘管我已經選擇了@Rick Sladkey的答案作爲答案(並且回答了我的問題),但我想我可能會發布我的最新理解,希望能夠幫助其他人解決問題。

真正的挫折點,事實證明,是在處理ScrollViewer。當我的內容大小調整到ScrollViewerActualWidth時,它的效果非常好,當它的VerticalScrollBar不可見時,只要我的內容長到可垂直滾動的高度,事情就開始崩潰。雖然我曾預計ActualWidth的約束力將我的控件調整爲適合ScrollViewer的可視區域,但實際上它保持相同的寬度並且也可以水平滾動。

事實證明,修復其實很簡單。不要將控件的高度或寬度分別綁定到ScrollViewer(分別爲)的ActualHeightActualWidth,請將控件的高度或寬度綁定到ScrollViewerViewportHeightViewportWidth

+0

+1,因爲它有助於'ScrollViewer';不幸的是,['ViewportWidth'](http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter.viewportwidth%28v=vs.110%29.aspx)和['ViewportHeight'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter.viewportheight%28v=vs.110%29.aspx)似乎不是['ScrollContentPresenter']上的依賴項屬性(http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollcontentpresenter%28v=vs.110%29.aspx)。 –

-1

除了手動設置寬度,怎麼樣,而不是綁定到網格的ActualWidth財產(這會給你的實際值)

+1

這不會爲我想要完成的工作。我發現,「網格」動態擴展以適應其包含的元素。其實我試圖確保'Grid'中的元素不會比'Grid'大。例如,如果DataGridTextColumn的寬度設置爲Star,則會導致Containing Grid增長。 –

5

這裏是沒有代碼 - 結合客戶寬度的大小的一種方式背後:

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"> 
    <Grid x:Name="testGrid" Background="DarkGray" Width="{Binding Content.ActualWidth, ElementName=mainWindow}"> 
    </Grid> 
</ScrollViewer> 

,它使用了一個名爲頂級Window,在這種情況下,與實際寬度得到的是內容,一個ScrollViewer。如果由於某種原因,您希望窗口的內容與窗口的大小不同,您可以將它放在空的Grid中,這樣該技術仍然有效。

+0

這正是我正在尋找的功能。現在我只需要找到一個處理邊距的方法。 –