2012-09-03 6 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の後にちょうど1回レイアウトのパスが必要です。

+0

コンテンツのMinWidth/MinHeightまたはMaxWidth/MaxHeightが変更された場合に、SizeChangedが発生するかどうか知っていますか?あるいは、これらのプロパティに別々にバインドを付ける必要がありますか? – EFraim

+0

これは間違いなく便利です。私は現在、問題が完全に解決しているかどうかを確認しています。 – EFraim

1

バインディングマークアップ拡張子を使用してください。バインディングとは、このプロパティ(ソース)の変更によって他のプロパティ(ターゲット)が更新されたときのwpfの表現方法です。この場合、グリッドのMinWidthプロパティはSourceであり、ウィンドウの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

あなたの言うことは技術的には真ですが、私が質問したように、私が直面する主な困難はテーマに依存しない方法で装飾の寸法を計算することです。もう1つの答えはパズルのこの部分を解決するため、私はそれを受け入れます。 – EFraim

5

SizeToContentを使用して提案されているものもありますが、これは制約ではなく初期ウィンドウのサイズを設定するのに役立ちます。

MainWindow.xaml

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

MainWindow.xaml.cs

を:

私はウィンドウが初期化された直後MinWidthMinHeightプロパティを設定することでこの問題を回避働いていました

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

これは受け入れられる回答である必要があります。 – user2481095

関連する問題