【问题标题】:Layout of window content is incorrect in case of Window.SizeToContent = SizeToContent.WidthAndHeight在 Window.SizeToContent = SizeToContent.WidthAndHeight 的情况下,窗口内容的布局不正确
【发布时间】:2016-09-24 13:55:05
【问题描述】:

我做了一个简单的例子。有一个工具窗口。它具有网格作为内容,具有三个区域。第一个区域是带有一些文本的文本框,第二个是标签,第三个是另一个文本框。 Grid 的行高分别为:“*”、“30”、“*”。对于我设置的窗口SizeToContent = SizeToContent.WidthAndHeight。当我打开它时,第一个 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";
        }
    }
}

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

初始图像:

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

【问题讨论】:

  • 尝试在您的文本框上设置VerticalAlignment=Stretch,以便它们伸展以填充网格单元格中的所有可用空间。
  • 不幸的是,它没有帮助。第一个TextBox在打开的时候还是比较大的。
  • 我不认为您可以提供正在运行的文本框和 3 列的屏幕截图。很可能是带有文本框的标签引起了问题,因为标签的填充会使它们的大小膨胀 - 也许尝试将标签的填充属性设置为“0,0,0,0”。
  • @Logan 我将代码放在一个测试项目中并添加了一些图像。在看到输出之前我也没有正确理解这个问题:)

标签: c# wpf xaml size


【解决方案1】:

您的示例可以正常工作。 大小是从孩子到根计算。因此,您的 TextBox 的内容高度较大,然后 Grid 使第一行和第三行相等,然后 Window.SizeToContent = "WidthAndHeight" 适合/最小化所有大小以适应其内容的大小。 因此,您会看到没有可用空间的窗口。

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

要检查它,您可以:

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

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

    所以一开始Grid的行会有不同的大小,调整大小后就相等了,BUT如果你按任意键,window会立即最小化他的大小,Grid的行就不相等了。

【讨论】:

    【解决方案2】:

    看起来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>
    

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

    【讨论】:

    • 这应该是公认的答案。效果很好,即使使用 Rectangle 作为底部“控件”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2022-01-03
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多