如何防止窗口底部的标签在调整大小时消失?

时间:2017-01-19 20:22:41

标签: wpf xaml

基本上我有一个SizeToContent="WidthAndHeight"的窗口,我的底部有一个标签。调整窗口大小时,标签会消失。除非我把窗户做得更大。

我有以下XAML代码:

<Window x:Class="DateKeeper.View.Test"
        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"
        xmlns:local="clr-namespace:DateKeeper.View"
        mc:Ignorable="d"
        Title="Test" SizeToContent="WidthAndHeight"
        >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label x:Name="label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Bottom" Grid.Column="0" Grid.Row="1" FontSize="36"/>
        <TextBlock x:Name="textBlock" Grid.Column="1" Text="TextBlock" VerticalAlignment="Bottom" Grid.Row="1" FontSize="36"/>
    </Grid>
</Window>

以下是图片:

调整大小之前

Before resizing

调整大小后

After resizing

3 个答案:

答案 0 :(得分:1)

SizeToWidthAndHeight设置窗口的初始大小。它不会阻止用户调整窗口大小。

ResizeMode="NoResize"会阻止所有调整大小。如果要设置最小大小并允许窗口大小大于此值,则不能在纯XAML中执行此操作。

但是,您可以使用初始大小作为最小宽度和高度,并在加载的处理程序中使用一些简单的代码,如下所示:

<Window 
    x:Class="DateKeeper.View.Test"
    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"
    xmlns:local="clr-namespace:DateKeeper.View"
    mc:Ignorable="d"
    Title="Test" 
    SizeToContent="WidthAndHeight"
    Loaded="Window_Loaded"
    >

Test.xaml.cs(或者你称之为上述Window的代码隐藏):

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MinWidth = ActualWidth;
    MinHeight = ActualHeight;
}

您还可以编写一个可以执行相同操作的附加属性。

更新

这种带有Mode=OneTime的纯XAML方法看起来很有希望:

<Window
    ...
    SizeToContent="WidthAndHeight"
    MinHeight="{Binding ActualHeight, RelativeSource={RelativeSource Self}, Mode=OneTime, PresentationTraceSources.TraceLevel=High}"
    MinWidth="{Binding ActualWidth, RelativeSource={RelativeSource Self}, Mode=OneTime}"
    ...

...但是在跟踪输出中,我们看到它在窗口大小调整到其内容之前很早就得到ActualHeightActualWidth的值,也许在实际的UI窗口对象之前甚至是创建 - 当实际宽度和高度都报告为零时。

答案 1 :(得分:1)

你现在有50%

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Label x:Name="label" Content="Label"  FontSize="36" 
                Grid.Row="1" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Left" />
    <TextBlock x:Name="textBlock" Text="TextBlock" FontSize="36"  
                Grid.Row="1" Grid.Column="1" VerticalAlignment="Bottom"/>
</Grid>

答案 2 :(得分:0)

不确定您要创建什么,但有三件事:

  1. 这些元素因为没有空间而离开了屏幕而失去了知名度

  2. 您的布局会将两个文本元素放在网格的第二行

    一个。元素只有50%的可用高度来渲染

    湾FontSize和Margins / Padding将进一步抵消此

  3. 您有两种不同的文本元素类型(Label和TextBlock)

    一个。两者都有不同的边距/填充值

    湾不同的布局值将导致不同的可见性级别

  4. 如果您不希望元素失去可见性,则需要设置窗口的最小大小(例如325x150)。