2012-09-03 51 views
9

我想讓窗口尊重MinWidth/MinHeightMaxWidth/MaxHeight裏面的內容控制規範。按內容大小調整窗口大小

一些建議使用SizeToContent,但這隻能幫助設置初始窗口大小,而不是約束。

其他人建議覆蓋MeasureOverride並設置窗口的最小/最大高度和寬度,但這似乎有點不潔,考慮到這樣一個微不足道的問題應該有一個純粹的聲明式解決方案。

剛剛提到另外一個解決方案,它似乎是合理的,但工作(並已在其中刪除了一個答案了前面提到的):綁定窗口MinWidth來控制的MinWidth沒有考慮到的窗口裝飾。

回答

7

如果初始窗口大小設置爲使得實際內容大小在初始佈局過程中不受內容的MinWidth/MinHeight和MaxWidth/MaxHeight的強制(例如,通過使用Window.SizeToContent =「WidthAndHeight」),則下面的公式成立:

Window.ActualSize - Content.ActualSize = 
     Window.MinSize - Content.MinSize = Window.MaxSize - Content.MaxSize. 

根據這些公式可以得到下面的代碼:

public MainWindow() 
{ 
    InitializeComponent(); 

    this.SizeChanged += OnWindowSizeChanged; 
} 

private static void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var window = (Window)sender; 
    var content = (FrameworkElement)window.Content; 

    window.MinWidth = window.ActualWidth - content.ActualWidth + content.MinWidth; 
    window.MaxWidth = window.ActualWidth - content.ActualWidth + content.MaxWidth; 

    window.MinHeight = window.ActualHeight - content.ActualHeight + content.MinHeight; 
    window.MaxHeight = window.ActualHeight - content.ActualHeight + content.MaxHeight; 

    window.SizeChanged -= OnWindowSizeChanged; 
} 

我不知道如何實現這一目標有效地使用純聲明性的方法,因爲代碼應該跑只是在ini之後tial佈局通行證。

+0

您是否知道在MinWidth/MinHeight或MaxWidth/MaxHeight內容更改的情況下是否會觸發SizeChanged?或者我應該單獨附加一個綁定到這些屬性? – EFraim

+0

這絕對有用,我目前正在檢查它是否完全解決了我的問題。 – EFraim

1

使用綁定標記擴展。綁定是wpf說這個屬性(源)何時更新某個其他屬性(目標)的方式。在這種情況下,網格的MinWidth屬性是源,並且您的窗口的MinWidth屬性是目標。

<Window x:Class="MinMaxValuesOnWindows.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="600" Width="800" 
    MinWidth="{Binding ElementName=gridy, Path=MinWidth}" 
    MinHeight="{Binding ElementName=gridy, Path=MinHeight}" 
    MaxWidth="{Binding ElementName=gridy, Path=MaxWidth}" 
    MaxHeight="{Binding ElementName=gridy, Path=MaxHeight}"> 
    <Grid Name="gridy" MinHeight="80" MinWidth="80" MaxHeight="300" MaxWidth="300"/> 
</Window> 

當你的話題,這並不完全工作中提到,但你可以使用綁定一個轉換器窗口框的高度和寬度添加更新綁定目標之前(可能需要的PInvoke)。由於我懷疑你的應用程序中的窗框厚度是動態變化的,這可能只是常數值(如果用戶更改主題,則不一定是正確的)。

+0

你說的從技術上講是真實的,但正如我在問題中指出的那樣,我面臨的主要困難是以獨立於主題的方式來計算裝飾尺寸。另一個答案解決了這個難題的部分,因此我會接受它。 – EFraim

5

一些建議使用SizeToContent,但這隻能幫助設置初始窗口大小,而不是約束。

我工作圍繞這通過設置MinWidthMinHeight性能之後窗戶被初始化:

MainWindow.xaml

<Window ... SizeToContent="WidthAndHeight"> 
    ... 
</Window> 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    SourceInitialized += (s, e) => 
    { 
     MinWidth = ActualWidth; 
     MinHeight = ActualHeight; 
    }; 
} 
+0

這應該是被接受的答案。 – user2481095