wpf中的状态栏

时间:2014-08-15 06:17:54

标签: wpf xaml statusbar

<StatusBar  Height="20" Grid.ColumnSpan="4" HorizontalAlignment="Left" Name="statusBar1" VerticalAlignment="Bottom" Width="1533" Background="AntiqueWhite">
        <TextBlock >HName:</TextBlock>
        <TextBlock Name="hname" Text="{Binding Path=CHost}"></TextBlock>
        <Separator/>
        <TextBlock >P:</TextBlock>
        <TextBlock Name="p" Text="{Binding Path=CPort, TargetNullValue=6130,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
        <Separator/>
        <TextBlock Name="cstatus">CStatus:</TextBlock>
        <TextBlock x:Name="CoStatus" Text="{Binding Path=CStatus, NotifyOnSourceUpdated=True,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
        <Separator/>
        <TextBlock AllowDrop="False" Name="sock1">CSock:</TextBlock>
        <TextBlock x:Name="CoName" Text="{Binding Path=CoName,NotifyOnSourceUpdated=True, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock>

        <Separator x:Name="seperator1" Margin="520,0,0,0"/>
        <TextBlock >HName:</TextBlock>
        <TextBlock Name="hname1" Text="{Binding Path=CHost1}"></TextBlock>
        <Separator/>
        <TextBlock >P:</TextBlock>
        <TextBlock Name="p1" Text="{Binding Path=CPort, TargetNullValue=6130,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
        <Separator/>
        <TextBlock Name="cstatus1">CStatus:</TextBlock>
        <TextBlock x:Name="CStatus1" Text="{Binding Path=CStatus1, NotifyOnSourceUpdated=True,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
        <Separator/>
        <TextBlock AllowDrop="False" Name="sock2">Sock1:</TextBlock>
        <TextBlock x:Name="CoName1" Text="{Binding Path=CoName1,NotifyOnSourceUpdated=True, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
    </StatusBar>

我已在主窗口中添加了此状态栏并放置在屏幕的底部。我在里面控制显示一些有价值的文字。

我必须在主窗口的同一状态栏上显示两个不同客户端的Hname,P,CStatus和sock的信息。

所以我习惯在他们之间腾出空间。

但是当我连接我的第二个客户端后,当我的应用程序第一次启动所有信息后,我想要的东西不应该是可见的那么这部分来了,但它们之间应该有足够的空间,以便Screen看起来很好。

状态栏的宽度和高度分别为1533和20。我试图在状态栏上为两个不同的客户端放置两个子状态栏,但SomeHow它不起作用。请建议如何做到这一点

1 个答案:

答案 0 :(得分:1)

一种解决方案是在状态栏内使用网格,如下所示:

<StatusBar HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch">
    <StatusBarItem HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" >
        <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="Auto"/>
                 <ColumnDefinition Width="*"/>
                 ...
            </Grid.ColumnDefinitions>
         <!-- Content goes here using the grid -->
         <Grid/>
      <StatusBarItem/>
 <StatusBar/>

或者使用itemtemplate作为状态栏,如下所示:

<StatusBar Height="40">
    <StatusBar.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition MaxWidth="100" />
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </StatusBar.ItemsPanel>

    <StatusBarItem Grid.Column="0">
    <!-- content... -->
    </StatusBarItem>

    <StatusBarItem Grid.Column="1">
    <!-- content -->
    </StatusBarItem>

    <StatusBarItem Grid.Column="2" Visibility="{Binding IsSomePropertyVisible, Converter={StaticResrouce BooleanToVisibilityConverter}}">
    <!-- content -->
    </StatusBarItem>
     ....
 </StatusBar>

使用IValueConverter确定状态栏的哪些部分应该可见。请注意立即设置明确的尺寸!通常,您希望某些属性是一个bool,它告诉用户是否已登录,并且只是绑定到该属性并使用BooleanToVisbilityConverter。

您也可以转储控件的模板并对其进行反汇编,以了解它在内部的工作原理。

希望它有所帮助,

干杯

了Stian