XAML WPF:停靠面板,Dock =“底部”未按预期工作

wlwcrazw  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(127)

这与粮食政策论坛有关。
作为一个简单的测试,我有一个有3列的网格,第三列包含一个停靠面板。反过来,这个停靠面板包含一个TextBlock和一个StatusBar,其中StatusBar具有(附加的)属性Dockpanel.Dock =“Bottom”。
因此,我希望StatusBar位于第3列的底部,而TextBlock(显示“I am TextBlock 3”的文本块)位于其顶部(在同一列中)。
然而,令我惊讶的是,StatusBar出现在TextBlock的右侧!
这是相关的xaml代码(我没有做代码隐藏):

<Window x:Class="Testing.TestWindow"
        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:Testing"
        mc:Ignorable="d"
        Title="TestWindow" Height="500" Width="1000">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="180" MaxWidth="540"  />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0">I am Textblock 1</TextBlock>

        <TextBlock Grid.Column="1">I am Textblock 2</TextBlock>

        <DockPanel Grid.Column="2">
            <TextBlock>I am Textblock 3</TextBlock>
            <StatusBar DockPanel.Dock="Bottom">I am the statusbar</StatusBar>
        </DockPanel>
    </Grid>

</Window>

有人知道我哪里做错了吗?谢谢。

pzfprimi

pzfprimi1#

更新您的DockPanel以具有LastChildFile="False"

<DockPanel Grid.Column="2" LastChildFill="false">

默认情况下,该属性为true,并且由于StatusBarDockPanelLastChild,因此您可以看到您所遇到的行为。

LastChildFill来自文档的信息:

如果最后一个子元素拉伸以填充剩余空间,则返回true;否则为false。默认值为true。

pkmbmrz7

pkmbmrz72#

我认为一个更好的解决方案是先放置状态栏,然后让文本框作为最后一个子对象填充状态栏上方的区域,相关代码如下所示。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MinWidth="180" MaxWidth="540"  />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0">I am Textblock 1</TextBlock>

    <TextBlock Grid.Column="1">I am Textblock 2</TextBlock>

    <DockPanel Grid.Column="2">
        <StatusBar DockPanel.Dock="Bottom">I am the statusbar</StatusBar>
        <TextBlock TextWrapping="Wrap">I am an incredibly long Textblock 3 and will fill the entire area above the statusbar...</TextBlock>
    </DockPanel>
</Grid>

最后就会变成这样。

相关问题