如何自定义WPF StatusBar布局?

Ken*_*art 30 wpf layout controls statusbar statusbaritem

将多个子项添加到WPF会StatusBar导致布局不佳,几乎没有自定义选项.例如,这段代码:

<Window x:Class="StatusBar.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <StatusBar DockPanel.Dock="Bottom">
            <StatusBarItem>
                <TextBlock>Ready</TextBlock>
            </StatusBarItem>
            <StatusBarItem>
                <TextBlock>Set</TextBlock>
            </StatusBarItem>
        </StatusBar>

        <Label>Main Content</Label>
    </DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

这不是理想的布局,因为"Set"被挤压到"Ready".

如何完全控制WPF StatusBar控件的布局?

Ken*_*art 81

默认情况下,StatusBar使用a DockPanel来定位其子项.这适用于一个项目,但在与多个孩子一起工作时往往会使事情变得混乱和不方便.

要获得对状态栏子项定位的高级控制,您可以换出DockPanel以下内容Grid:

<Window x:Class="StatusBar.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <StatusBar DockPanel.Dock="Bottom">
            <StatusBar.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="4*"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </StatusBar.ItemsPanel>
            <StatusBarItem>
                <TextBlock>Ready</TextBlock>
            </StatusBarItem>
            <StatusBarItem Grid.Column="1">
                <ProgressBar Value="30" Width="80" Height="18"/>
            </StatusBarItem>
            <StatusBarItem Grid.Column="2">
                <TextBlock>Set</TextBlock>
            </StatusBarItem>
            <StatusBarItem Grid.Column="3">
                <TextBlock>Go!</TextBlock>
            </StatusBarItem>
        </StatusBar>

        <Label>Main Content</Label>
    </DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

这导致:

在此输入图像描述

为了更深入的讨论,请访问我的博客文章在这里.

  • @David:不要太荒谬.我发布了这个问题,因为谷歌分析告诉我这是我最受欢迎的博客文章之一,所以在stackoverflow上直接回答这个问题对社区是有益的.我的博客上没有广告,所以不要从链接诱饵中获得任何收益.我在答案中提供了足够多的信息,除非您需要更多信息,否则您甚至不需要访问我的博客.现在请去找一些有建设性的事情. (38认同)

小智 12

实际上,按照Kent的回复,我试过这个并且它工作正常:

<StatusBar>
    <StatusBarItem DockPanel.Dock="Right">
        <TextBlock>Go!</TextBlock>
    </StatusBarItem>
    <StatusBarItem DockPanel.Dock="Right">
        <TextBlock>Set</TextBlock>
    </StatusBarItem>
    <StatusBarItem DockPanel.Dock="Right">
        <ProgressBar Value="30" Width="80" Height="18"/>
    </StatusBarItem>
    <!-- Fill last child is true by default -->
    <StatusBarItem>
        <TextBlock>Ready</TextBlock>
    </StatusBarItem>
</StatusBar>
Run Code Online (Sandbox Code Playgroud)

  • 我想如果你了解DockPanel的工作方式,这是最干净的方法. (6认同)