如何覆盖标签可见性?

时间:2018-07-05 14:02:04

标签: c# wpf

我想通过其他内容隐藏标签的可见性,假设我有一个包含DataGrid的GroupBox:

<GroupBox>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>

我想插入一个Label,它仅在隐藏DataGrid时出现,所以我尝试了一个简单的StackPanel

<GroupBox>
  <StackPanel Orientation="Vertical">
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" />
  </StackPanel>
</GroupBox>

所以我试图在代码后设置DataGrid的可见性,例如:

Dt.Visibility = Visibility.Hidden;

这将隐藏DataGrid,但是主要的问题是标签,实际上,即使Dt可见,标签也可见。

仅当DataGrid隐藏时,如何显示标签?

5 个答案:

答案 0 :(得分:1)

使用Grid面板并将Label放置在DataGrid之前。它们位于相同的网格单元中,这将确保Label在可见时被DataGrid覆盖。

<GroupBox>
  <Grid>
    <Label Content="Foo" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
  </Grid>
</GroupBox>

答案 1 :(得分:1)

您可以将标签的可见性默认为“隐藏”,然后在后面的代码中,当以任何调整方法隐藏了DataGrid时,都可以将标签的可见性设置为“可见”

XAML:

<GroupBox>
  <StackPanel Orientation="Vertical">
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" Visibility="Hidden" x:Name="fooLabel" />
  </StackPanel>
</GroupBox>

后面的代码:

private void yourMethod(object sender, RoutedEventArgs e)
{
    Dt.Visibility = Visibility.Hidden;
    fooLabel.Visibility = Visibility.Visible;
}

答案 2 :(得分:1)

您可以将Style应用于Label,并将DataTrigger绑定到Visibility的{​​{1}}属性:

DataGrid

使用仅XAML的方法,您可以绑定到<GroupBox> <StackPanel Orientation="Vertical"> <DataGrid x:Name="Dt" Visibility="Collapsed"> <DataGrid.Columns> <DataGridTextColumn Header="home" /> </DataGrid.Columns> </DataGrid> <Label Content="Foo"> <Label.Style> <Style TargetType="Label"> <Style.Triggers> <DataTrigger Binding="{Binding Visibility, ElementName=Dt}" Value="Visible"> <Setter Property="Visibility" Value="Collapsed" /> </DataTrigger> </Style.Triggers> </Style> </Label.Style> </Label> </StackPanel> </GroupBox> 的任何属性。例如,您可以绑定到DataGrid属性,并且仅在HasItems为空时显示Label。无需转换器。

答案 3 :(得分:1)

您可以将标签的可见性绑定到数据网格的可见性,并使用切换值的转换器:

<GroupBox>
  <StackPanel Orientation="Vertical">
    <StackPanel.Resources>
         <local:VisibilityInverter x:key="VisInverter"/>
    </StackPanel.Resources>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" Visibility="{Binding Path=Visibility, ElementName=Dt, Converter={StaticResource VisInverter}}" />
  </StackPanel>
</GroupBox>

这里是转换器

public class VisibilityInverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Hidden;

        if (value == Visibility.Visible)
            return Visibility.Hidden;

        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, ultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

答案 4 :(得分:0)

您可以使用Datagrid元素的Visibility属性,并在网格可见时将其分配给标签。标签也将可见。

<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />