WPF: How to hide the empty Hyperlink?

梦想的初衷 提交于 2019-12-13 04:18:58

问题


In the previous question of mine, I have asked how to hide an empty TextBlock, so that it doesn't take space in the panel. I have a new challenge now. How am I supposed to hide an empty Hyperlink:

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

This is what made the hiding possible in the previous question:

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

Providing this style on first TextBlock won't work because the Text property is not set. Providing style on Hyperlink doesn't hide the parent TextBlock and same happens if I try to hide the TextBlock inside the Hyperlink.

I am certain that my style needs to be applied on the Hyperlink, but the trigger inside should target the Visibility property of the 'Hyperlink's parentTextBlock`. What is the style supposed to look like?


回答1:


Just use DataTrigger on the top level TextBlock to check whether the bound property is an empty string:

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

EDIT:

Also you can try binding to the child hyperlink's NavigationUri property:

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



回答2:


The solution provided by Foovanadil that solves the similar issue by implementing visibility converter works the best in my opinion. It is the easiest to implement and can be reused whenever needed.

The converter should be implemented like this:

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();
    }
}

}

And used like this:

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

All credits go to the original solution provider: Foovanadil



来源:https://stackoverflow.com/questions/5577890/wpf-how-to-hide-the-empty-hyperlink

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!