在Window.SizeToContent = SizeToContent.WidthAndHeight

时间:2016-05-26 13:54:48

标签: c# wpf xaml size

我做了一个简单的例子。有一个工具窗口。它以Grid为内容,有三个区域。第一个区域是带有一些文本的TextBox,第二个区域是Label,第三个区域是另一个TextBox。网格行的高度分别为:" *"," 30"," *"。对于我设置SizeToContent = SizeToContent.WidthAndHeight的窗口。当我打开它时第一个TextBox的高度大于第二个TextBox的高度。当我尝试重新调整窗口时,高度按预期成比例。

窗口有xaml:

 <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Class="WpfApplication5.MainWindow"
    Title="MainWindow" MinHeight="200" MinWidth="200"
    DataContext="System.Data.DataSet" Width="291" d:DesignHeight="246"
    WindowStyle="ToolWindow"
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
            <TextBox x:Name="Text1" />
        <Label Grid.Row="1" Content="SOME TEXT"/>
            <TextBox x:Name="Text2" Grid.Row="2"/>
    </Grid>
</Window>

代码背后:

using System.Data;
using System.Windows;

namespace WpfApplication5
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            Text1.Text =
                "some text\nsome text\nsome text\nsome text\nsome text\nsome text\nsome text\nsome text\nsome text\n";
        }
    }
}

我的问题是:如何解决这些跳跃高度?最初高度应该是成比例的。

初始图片:

enter image description here

调整大小后(加载时我想要的):

enter image description here

2 个答案:

答案 0 :(得分:1)

您的样本可以正常工作。 大小从childs到root计算。因此,您的TextBox具有较大高度的内容,然后Grid使第一行和第三行相等,然后 Window.SizeToContent =“WidthAndHeight”适合/最小化所有大小与其内容的大小。 因此,您会看到没有空闲空间的窗户。

当您触发窗口调整大小时,规则SizeToContent变为false,因为您手动设置窗口大小并且可以重新计算。所以网格行的大小相等。

要检查它,您可以:

  1. 删除SizeToContent =“WidthAndHeight”,您将看到网格的行高与预期相同
  2. 或添加例如KeyDown事件,如

    private void UIElement_OnKeyDown(object sender, KeyEventArgs e)
    {
        SizeToContent = SizeToContent.WidthAndHeight;
    }
    

    所以在开始时网格行将有不同的大小,在调整大小后,它们变得相等,但是如果按任意键,窗口会立即最小化其大小并且网格行将不相等。

答案 1 :(得分:1)

在渲染初始网格后,似乎{em}应用了SizeToContent。因此,最初使用两个大小相同的文本框计算网格,然后应用SizeToContent并将所有控件调整为最小尺寸。

作为解决方法,您可以将SharedSizeGroup应用于网格行,以便在SizeToContent尝试调整所有内容时强制它们具有相同的大小。

 <Window ...
    WindowStyle="ToolWindow"
    SizeToContent="WidthAndHeight">
    <Grid Grid.IsSharedSizeScope="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"  SharedSizeGroup="A"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"  SharedSizeGroup="A"/>
        </Grid.RowDefinitions>
            <TextBox x:Name="Text1" />
        <Label Grid.Row="1" Content="SOME TEXT"/>
            <TextBox x:Name="Text2" Grid.Row="2"/>
    </Grid>
</Window>

然后在初始加载时,它看起来像这样:

enter image description here