Search code examples
c#wpfstatusbartextblockcss

MinWidth take no effect


I have a StatusBar with two TextBlock-items:

    <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>

When StatusBarTextBlock is to long, StatusBarTimeBlock will be lesser then 75px.

Have you any ideas why?


Solution

  • That's because your first StatusBarItem takes whole place and second StatusBarItem doesn't fit in StatusBar

    Try this code an look what it does

    <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>
    

    You have 600px StatusBar and Max of 550px first StatusBarItem... So there is only 50px left for second StatusBarItem so it doesn't fit in your StatusBar. In your code you didn't specity Width property for your StatusBarTextBlock so it takes all(if text is long enough).

    Now let's try something different...

    <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>
    

    I switched order of StatusBarItems and set MinWidth of TimeBlock StatusBarItem to 250px... Well it's added to the StatusBar and it no longer ignores MinWidth beause it's first item and it fits into 600px StatusBar.

    So MinWidth is ignored only if there is not enough space left in StatusBar.

    But if you paid attention to the code I provided You probably noticed something. There is

    <StatusBarItem HorizontalAlignment="Right" ... >
    

    And that's not saying that your StatusBarItem with StatusBarTimeBlock will be at right... because Items in StatusBar are always added from left to right no matter what. So it may be aligned to right, but it's only aligned to next item or end of StatusBar if there is no other item.

    EDIT

    My answer was composed to answer your question

    When StatusBarTextBlock is too long, StatusBarTimeBlock will be less than 75px. Have you any ideas why?

    And it did, but as it seems it's not what you wanted.

    As I said items in StatusBar are always added from left to right no matter what. And That's because it's items are hosted in DockPanel. If you know how DockPanel works you also know, that you can Dock some items to the right.

    So you can do this. It happens to be what you want but didn't ask for.

    <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>
    

    Notice that StatusBarTimeBlock is "first in XAML" again, but it's docked to right.