我有一个带有两个TextBlock项的StatusBar:

    <StatusBar
        x:Name="MainStatusBar"
        Grid.Row="1" Grid.ColumnSpan="2" Height="30"
        HorizontalContentAlignment="Left" VerticalContentAlignment="Center">
        <StatusBarItem HorizontalAlignment="Stretch">
            <TextBlock
                x:Name="StatusBarTextBlock"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Center"
                TextWrapping="NoWrap"
                Text="{Binding StatusBarText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
        <StatusBarItem HorizontalAlignment="Right">
            <TextBlock
                x:Name="StatusBarTimeBlock"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Center"
                TextWrapping="NoWrap"
                MinWidth="75"
                Text="{Binding SearchTime, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
    </StatusBar>


StatusBarTextBlock太长时,StatusBarTimeBlock将小于75px

你有什么想法吗?

最佳答案

那是因为您的第一个StatusBarItem占据了整个位置,而第二个StatusBarItem却不适合StatusBar

试试这段代码看看它做什么

<StatusBar
    x:Name="MainStatusBar" Margin="14,462,0,0" HorizontalAlignment="Left" Width="600" VerticalAlignment="Top">
        <StatusBarItem MaxWidth="550">
            <TextBlock
            x:Name="StatusBarTextBlock"
            TextWrapping="NoWrap"
            Text="{Binding StatusBarText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
        <StatusBarItem HorizontalAlignment="Right" MinWidth="75">
            <TextBlock
            x:Name="StatusBarTimeBlock"
            TextWrapping="NoWrap"
            Text="{Binding SearchTime, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
</StatusBar>


您的第一个StatusBarItem有600像素StatusBar且最大值为550像素...因此第二个StatusBarItem仅剩50像素,因此它不适合您的StatusBar。在您的代码中,您没有为Width指定StatusBarTextBlock属性,因此它占用了所有内容(如果文本足够长)。

现在让我们尝试一些不同的东西...

<StatusBar
    x:Name="MainStatusBar" Margin="14,462,0,0" HorizontalAlignment="Left" Width="600" VerticalAlignment="Top">
        <StatusBarItem HorizontalAlignment="Right" MinWidth="250">
            <TextBlock
            x:Name="StatusBarTimeBlock"
            TextWrapping="NoWrap"
            Text="{Binding SearchTime, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
        <StatusBarItem>
            <TextBlock
            x:Name="StatusBarTextBlock"
            TextWrapping="NoWrap"
            Text="{Binding StatusBarText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
</StatusBar>


我切换了StatusBarItems的顺序,并将TimeBlock StatusBarItem的MinWidth设置为250px ...好,它已添加到StatusBar中,因为它是第一项,它不再适合MinWidth,因此它可以容纳600px StatusBar

因此,仅当MinWidth中没有足够的空间时,才会忽略StatusBar

但是,如果您注意我提供的代码,您可能会注意到。有

<StatusBarItem HorizontalAlignment="Right" ... >


并不是说您将StatusBarItemStatusBarTimeBlock放在右边...因为StatusBar中的项目无论如何总是从左到右添加。
因此它可能右对齐,但如果没有其他项,则仅与下一项或StatusBar的末尾对齐。

编辑

我的答案旨在回答您的问题

当StatusBarTextBlock太长时,StatusBarTimeBlock将小于75px。
你有什么想法吗?

它确实做到了,但似乎并不是您想要的。

正如我所说,StatusBar中的项目无论如何总是从左到右添加。那是因为它的项目托管在DockPanel中。
如果您知道DockPanel的工作原理,那么您也可以将某些项目停靠在右边。

因此,您可以执行此操作。它恰好是您想要的但没有要求。

<StatusBar x:Name="MainStatusBar" Margin="14,490,0,0" HorizontalAlignment="Left" Width="600" VerticalAlignment="Top">
        <StatusBarItem DockPanel.Dock="Right" HorizontalAlignment="Right" MinWidth="75">
            <TextBlock
            x:Name="StatusBarTimeBlock"
            TextWrapping="NoWrap"
            Text="{Binding SearchTime, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
        <StatusBarItem>
            <TextBlock
            x:Name="StatusBarTextBlock"
            TextWrapping="NoWrap"
            Text="{Binding StatusBarText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
        </StatusBarItem>
</StatusBar>


请注意,StatusBarTimeBlock再次是“ XAML中的第一个”,但它停靠在右边。

09-25 20:07