WPF:如何隐藏空的超链接?

时间:2011-04-07 08:10:04

标签: wpf styles

the previous question of mine中,我询问了如何隐藏空TextBlock,以便它不占用面板中的空间。我现在面临新的挑战。我该如何隐藏空Hyperlink

<TextBlock>
  <Hyperlink 
      NavigateUri="{Binding Path=Email}"
      RequestNavigate="Hyperlink_RequestNavigate">
    <TextBlock Text="{Binding Path=Email}" />
  </Hyperlink>
</TextBlock>

这就是上一个问题隐藏的原因:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>

在第一个TextBlock上提供此样式将不起作用,因为未设置Text属性。在Hyperlink上提供样式不会隐藏父TextBlock,如果我尝试隐藏TextBlock内的Hyperlink,也会发生同样的情况。

我确信我的样式需要应用于Hyperlink,但内部触发器应该定位'Hyperlink Visibility TextBlock`的's parent属性。应该是什么样的风格?

2 个答案:

答案 0 :(得分:3)

只需在顶级DataTrigger上使用TextBlock来检查绑定属性是否为空字符串:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Email}" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>

修改

您也可以尝试绑定到子超链接的NavigationUri属性:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Inlines
[0].NavigateUri}" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>

答案 1 :(得分:0)

solution提供的Foovanadil通过实施可见性转换器来解决类似问题,在我看来效果最好。它是最容易实现的,可以在需要时重复使用。

转换器应该像这样实现:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                                                            CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value as string))
        {
            return Visibility.Collapsed;
        }
        else
        {
            return Visibility.Visible;
        }
    }

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

}

并像这样使用:

<Window.Resources>
    <!-- Visibility converter -->
    <converters:VisibilityConverter x:Key="visibleConv" />
</Window.Resources>
...
<TextBlock Visibility="{Binding Something, Converter={StaticResource visibleConv}}">
    <Hyperlink NavigateUri="{Binding Something}">
        <TextBlock Text="{Binding Something}" />
    </Hyperlink>
</TextBlock>

所有积分均转至原始解决方案提供商:Foovanadil