10

MinWidthウィンドウが/MinHeightおよびMaxWidth/MaxHeight内部のコンテンツ コントロールの仕様を尊重するようにしたい。

を使用することを提案する人もSizeToContentいましたが、これは制約ではなく初期ウィンドウ サイズの設定に役立つだけです。

他の人は、ウィンドウの最小/最大の高さと幅を上書きMeasureOverrideして設定することを提案しましたが、そのような些細な問題には純粋に宣言的な解決策があるはずであることを考えると、これはやや不潔に思えます。

合理的と思われるが機能しないMinWidth別の解決策について言及するだけです(削除された回答で以前に言及されていました):コントロールへのウィンドウのバインディングは、ウィンドウMinWidthの装飾を考慮しません。

4

3 に答える 3

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;
}

最初のレイアウト パスの後にコードを 1 回だけ実行する必要があるため、純粋な宣言型アプローチを使用してこれを効率的に達成する方法がわかりません。

于 2012-12-02T18:41:30.583 に答える
5

を使用することを提案する人もSizeToContentいましたが、これは制約ではなく初期ウィンドウ サイズの設定に役立つだけです。

ウィンドウが初期化された直後にMinWidthプロパティとMinHeightプロパティを設定することで、これを回避しました。

MainWindow.xaml

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

MainWindow.xaml.cs

public MainWindow()
{
    InitializeComponent();
    SourceInitialized += (s, e) =>
    {
        MinWidth = ActualWidth;
        MinHeight = ActualHeight;
    };
}
于 2015-01-13T19:09:45.357 に答える
2

Binding マークアップ拡張機能を使用します。バインディングは、このプロパティ (ソース) の変更が他のプロパティ (ターゲット) を更新するときの 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 が必要になる場合があります)。アプリケーションでウィンドウ フレームの厚さが動的に変化しているとは思えないため、これはおそらく定数値である可能性があります (ユーザーがテーマを変更した場合は必ずしもそうではありません)。

于 2012-12-09T04:54:37.140 に答える