【问题标题】:C# WPF XAML status bar alignmentC# WPF XAML 状态栏对齐
【发布时间】:2017-12-17 03:47:24
【问题描述】:

当文本默认启动before时一切都很好,但是当我添加歌曲名称时,状态向右移动并且状态栏在区域之外。 after

<StatusBar Margin="0,730,0,0" DockPanel.Dock="Bottom" >
        <WrapPanel >
        <Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
        <Label x:Name="lblstatusPolaczenia" Margin="200,0,0,0" HorizontalAlignment="Center">status: disconnected</Label>
        <ProgressBar Width="100" Height="15" Value="50" Margin="200,0,0,0" HorizontalAlignment="Right" />
        </WrapPanel>
    </StatusBar>

我该如何修复这个问题?

【问题讨论】:

  • 当面板停靠在窗口底部时,为什么要定义这么大的边距?当然,停靠就足够了,您不需要到顶部有 730 像素的边距?
  • 无边距停靠面板没有停靠在底部,我知道为什么

标签: c# wpf alignment statusbar status


【解决方案1】:

不要使用WrapPanel,而是尝试使用Grid。这样,如果添加文本,您将拥有不会影响其他元素的固定列

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
    <Label x:Name="lblstatusPolaczenia" Grid.Column="1" HorizontalAlignment="Center">status: disconnected</Label>
    <ProgressBar Width="100" Height="15" Value="50" Grid.Column="2" HorizontalAlignment="Right" />
</Grid>

您可以调整每个 ColumnDefinition 上的 Width 以获得更大尺寸的列供您使用

【讨论】:

    【解决方案2】:

    首先,去掉边距。 他们没有帮助,他们只是让事情变得不那么明显,他们应该如何对齐。

    根据您的边距值,我猜您希望状态栏在左侧显示标签,在中间显示另一个标签,在右侧显示进度条。

    下面显示了如何使用第二个停靠面板执行此操作。 Dock 面板在这里是理想的,因为它向子组件报告其大小的方式是一致的。

    如果您想将此状态面板放置在另一个 DockPanel 上,则必须先完成一些操作,然后才能按照您的需要进行渲染。

    首先,你的主停靠面板必须有内容,否则边界面板将不会呈现在正确的位置。

    其次,如果您设置了LastChildFill=True,您必须将您的主要内容添加为最后一项。 如果您设置主要内容然后添加状态栏,即使您已将其停靠在底部,它仍会尝试填充面板。

    我在测试后更新了代码 sn-p(我的第一次尝试是直接输入 SO,抱歉没用)。

            <StatusBar DockPanel.Dock="Bottom"
                   Name="statusBar"
                   Height="50"
                   HorizontalAlignment="Stretch"
                   HorizontalContentAlignment="Stretch">
            <DockPanel LastChildFill="True"
                       Width="{Binding ActualWidth, ElementName=statusBar, Mode=OneWay}">
                <ProgressBar DockPanel.Dock="Right"
                             Width="100"
                             Value="50" />
                <Label x:Name="tytulUtworu"
                       DockPanel.Dock="Left"
                       ContentStringFormat="music: {0}"
                       Content="none" />
                <Label x:Name="lblstatusPolaczenia" 
                       HorizontalContentAlignment="Center"
                       Content="disconnected"
                       ContentStringFormat="status: {0}" />
            </DockPanel>
        </StatusBar>
    

    【讨论】:

    • 现在试试 sn-p。
    • 歌名很长,它的中心状态向右移动;)但是progressBar很好。我很好奇代码 Width.... mode=OneWay" 做了什么(?)ibb.co/drJ4Ua
    • @Sheep 它将停靠面板的宽度绑定到状态栏的宽度。绑定在状态栏的属性ActualWidth上,OneWay表示状态栏大小的改变会改变它上面的停靠面板。调整大小时,某些 WPF 组件的行为并不总是如您所期望的那样。这种方法可确保尺寸正确更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2020-05-14
    • 2017-01-14
    相关资源
    最近更新 更多