C# WPF - Dockpanel 的 children 折叠而不调整其他可见子项的大小

C# WPF - Dockpanel's children collapsed not resizing the other visible childs

如果我没有找到任何关于我的小烦人问题的亲戚,我很抱歉post/questions。

我有一个 WPF window 和一个托管三个控件的 DockPanel (LastChildFill = True) :

我所做的是,当正在进行的测试 "pass" 它没有数据可以推送到列表框中,所以我将其折叠起来,然后我希望标题标签在可用的 space 列表框及其边框未使用。

当我有 "fail" 或 "error" 时,我有数据要放入列表框中,然后它就可见了,一切都如预期的那样。

来这里之前我尝试了很多事情,但我在这上面浪费了足够的时间,因为我需要在写到这里之前完成其他事情。

谁能告诉我如何解决我的问题(列表框+边框折叠时居中标签)?

这是我的 xaml 代码 window :

<Window x:Class="NI.TestStand.WPFControls.Views.DisplayBannerView"
        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:NI.TestStand.WPFControls"
        mc:Ignorable="d"
        Title="DisplayBanner" x:Name="DisplayBannerMessage" Height="500" Width="800" MinHeight="300" MinWidth="500">
    <Window.Resources>
        <Style x:Name="BaseWindowFont" TargetType="Window">
            <Setter Property="FontFamily" Value="Arial"></Setter>
            <Setter Property="FontSize" Value="16"></Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Border BorderBrush="Black" BorderThickness="2">
            <DockPanel LastChildFill="True">
                <Button 
                    x:Name="butOK" 
                    DockPanel.Dock="Bottom" 
                    Margin="10" Content="OK" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Top" 
                    Padding="10" Width="150" 
                    Click="butOK_Click"/>

                <Label 
                    x:Name="main_message" 
                    Padding="15" 
                    FontSize="50"                     
                    Content="MAIN_MSG" 
                    DockPanel.Dock="Top"
                    HorizontalAlignment="Center" 
                    VerticalContentAlignment="Center" />

                <Border BorderBrush="Chocolate" BorderThickness="2" Margin="10" Name="messages_border">
                    <ListBox                                                               
                        Background="{Binding ElementName=DisplayBannerMessage, Path=Background}" 
                        Foreground="Black" 
                        ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                        ScrollViewer.VerticalScrollBarVisibility="Auto"                     
                        ScrollViewer.CanContentScroll="True"
                        VerticalContentAlignment="Top" 
                        VerticalAlignment="Stretch"
                        x:Name="detail_message">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" ToolTip="{Binding}"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </Border>
            </DockPanel>
        </Border>
    </Grid>
</Window>

这是显示通过和错误的图像以显示差异。
当列表框折叠时,绿色石灰 window 中的 PASSED 标题消息应该位于 window 的中间..

感谢您的帮助和时间

我会这样设计整个东西:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Border BorderBrush="Black" BorderThickness="2"
            Grid.RowSpan="{Binding PassErrorBooleanProperty, Converter={StaticResource BoolToRowSpanConverter}}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <Label 
                    x:Name="main_message" 
                    Padding="15" 
                    FontSize="50"                     
                    Content="MAIN_MSG" 
                    DockPanel.Dock="Top"
                    HorizontalAlignment="Center" 
                    VerticalContentAlignment="Center" />

            <Border Grid.Row="1" BorderBrush="Chocolate" BorderThickness="2" Margin="10" Name="messages_border"
                    Visibility="{Binding PassErrorBooleanProperty, Converter={StaticResource BoolToVisibilityConverter}}">
                <ListBox                                                               
                        Background="{Binding ElementName=DisplayBannerMessage, Path=Background}" 
                        Foreground="Black" 
                        ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                        ScrollViewer.VerticalScrollBarVisibility="Auto"                     
                        ScrollViewer.CanContentScroll="True"
                        VerticalContentAlignment="Top" 
                        VerticalAlignment="Stretch"
                        x:Name="detail_message">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" ToolTip="{Binding}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Border>

            <Button Grid.Row="2"
                    x:Name="butOK" 
                    DockPanel.Dock="Bottom" 
                    Margin="10" Content="OK" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Top" 
                    Padding="10" Width="150" 
                    Click="butOK_Click" />
        </Grid>
    </Border>
</Grid>

PassErrorBooleanProperty 有两个绑定(我已经将其编造为您用来指示结果的东西,您可能已经为此准备了其他东西),并且您需要两种不同的转换器,一种用于转换为 Visibility,另一种用于转换为 int (Grid.RowSpan).

当值为 true(通过)时,您将从转换器获得 return Visibility.Collapsed2。当值为 false 时,您将 return Visibility.Visible1.

如果您需要有关转换器的更多信息,请告诉我,尽管有很多关于使用 IValueConverter 创建布尔值到可见性转换器等的信息