19

WPF ウィンドウの初期クライアントサイズを設定したいと考えています。これを行う簡単な方法はわかりません。

具体的には、ウィンドウが開いたときに、スクロールバーを必要とせずにコンテンツが収まる大きさにする必要があります。しかし、表示された後、ウィンドウのサイズを自由に変更できるようにしたい (大きくても小さくても)。

Window 要素に Width 属性と Height 属性を設定すると、非クライアント(外側) のサイズが設定されますが、これは役に立ちません。タイトルバーとサイズ変更の境界線がそのスペースに食い込むと、クライアント領域はそのコンテンツに対して十分な大きさではなくなり、スクロールバーが表示されます。より大きなサイズを選択することで補正できますが、タイトルバーの高さと境界線の太さは両方ともユーザーがカスタマイズでき (OS のバージョンによって異なるデフォルトも同様)、別のマシンで必ずしも同じになるとは限りません。

ウィンドウのコンテンツ要素 (この場合は a) に幅と高さを<Grid>設定してから、ウィンドウの SizeToContent 属性を WidthAndHeight に設定します。これにより、ウィンドウの初期サイズが必要な場所に正確に取得されます。しかし、その後、サイズが変更されなくなりました。ウィンドウのサイズを変更できますが、固定サイズを指定したため、ウィンドウのコンテンツのサイズが変更されません。

できれば分離コードなしで、ウィンドウの初期クライアント サイズを設定する方法はありますか? (それが唯一の方法である場合はコード ビハインドを使用しますが、誰かが XAML のみのアプローチを持っている場合は、XAML のみのアプローチをお勧めします。)

4

7 に答える 7

22

次の 2 つの方法のいずれかで、Load イベント ハンドラーのコード ビハインドで実行できます。

注: LayoutRoot Grid の内容は両方の例で同じですが、LayoutRoot の幅と高さは例 A でのみ指定されています。

A) Window の SizeToContent およびコンテンツの Width と Height の ClearValue:

using System.Windows;

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

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ClearValue(SizeToContentProperty);
            LayoutRoot.ClearValue(WidthProperty);
            LayoutRoot.ClearValue(HeightProperty);
        }
    }
}

次のようなページ レイアウトを想定します (Window の SizeToContent 設定と Loaded イベント ハンドラー、および LayoutRoot で指定された Width と Height に注意してください)。

<Window x:Class="WpfWindowBorderTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" SizeToContent="WidthAndHeight" Loaded="Window_Loaded">
    <Grid x:Name="LayoutRoot" Width="300" Height="300" Background="Green">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Row="0" Grid.Column="0" Fill="Black" />
        <Rectangle Grid.Row="0" Grid.Column="0" Width="75" Height="75" Fill="Red" />
        <Rectangle Grid.Row="1" Grid.Column="1" Fill="Yellow" />
        <Rectangle Grid.Row="1" Grid.Column="1" Width="225" Height="225" Fill="Red" />
    </Grid>
</Window>

また

B) システム固有のクライアント ウィンドウ フレーム サイズを考慮して、ウィンドウの幅と高さを設定します。

System.Windows を使用します。

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

            const int snugContentWidth = 300;
            const int snugContentHeight = 300;

            var horizontalBorderHeight = SystemParameters.ResizeFrameHorizontalBorderHeight;
            var verticalBorderWidth = SystemParameters.ResizeFrameVerticalBorderWidth;
            var captionHeight = SystemParameters.CaptionHeight;

            Width = snugContentWidth + 2 * verticalBorderWidth;
            Height = snugContentHeight + captionHeight + 2 * horizontalBorderHeight;
        }
    }
}

次のようなプロポーショナル ページ レイアウトを想定しています (Window の SizeToContent 設定または Loaded イベント ハンドラー、または LayoutRoot で指定された Width と Height に注意してください)。

<Window x:Class="WpfWindowBorderTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Grid x:Name="LayoutRoot" Background="Green">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Row="0" Grid.Column="0" Fill="Black" />
        <Rectangle Grid.Row="0" Grid.Column="0" Width="75" Height="75" Fill="Red" />
        <Rectangle Grid.Row="1" Grid.Column="1" Fill="Yellow" />
        <Rectangle Grid.Row="1" Grid.Column="1" Width="225" Height="225" Fill="Red" />
    </Grid>
</Window>

XAML で宣言的に行う方法はまだ思いつきません。

于 2009-07-15T23:04:51.207 に答える
17

XAML でウィンドウの幅と高さの属性を削除し、SizeToContent="WidthAndHeight" を追加できます。これにより、ウィンドウの初期サイズがそのコンテンツに設定されますが、サイズを変更することもできます。

<Window x:Class="WpfApplication2.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" SizeToContent="WidthAndHeight">
    <Grid>
        <TextBlock Text="How to set WPF window’s startup ClientSize?"/>
    </Grid>
</Window>

開始すると、次のようになります。

ここに画像の説明を入力

それでも、マウスで引き伸ばすことができます。

ここに画像の説明を入力

于 2009-07-04T05:44:56.107 に答える
2

コンストラクターで次のことを行い、xamlにResizeMode = "CanResizeWithGrip"を追加しますが、起動時にコンテンツが占めるスペースの量によって異なります。

public Window1()
{
    this.Height = SystemParameters.WorkArea.Height;
    this.Width = SystemParameters.WorkArea.Width;
}
于 2009-07-04T12:29:01.007 に答える