在WPF和Silverlight应用程序中,HyperlinkButton是一个常用的控件,用于创建超链接。它允许用户通过点击链接跳转到指定的URL。HyperlinkButton的使用非常简单,只需要设置NavigateUri属性来定义链接的目标地址,同时设置TargetName属性来指定目标窗口或框架,例如_blank或_self。
以下代码示例展示了如何定义一个显示为"Titan Blog"的HyperlinkButton,并且点击后会在新窗口中打开博客地址:
<HyperlinkButton Content="Titan Blog" NavigateUri="http://cloudstore.spaces.live.com" TargetName="_blank" />
NavigateUri属性的类型实际上是Uri。在WPF和Silverlight中,许多属性都允许直接指定一个字符串而不是实际类型的实例,系统会自动使用转换器将字符串转换为所需的类型。例如,在上一个代码示例中,NavigateUri属性指定的字符串会被转换为Uri类型。
以下是如何在代码中定义上述HyperlinkButton的示例:
C# HyperlinkButton targetLink = new HyperlinkButton();
targetLink.Content = "Titan Blog";
targetLink.NavigateUri = new Uri("http://cloudstore.spaces.live.com");
targetLink.TargetName = "_blank";
直接进入主题,当涉及到HyperlinkButton控件的数据绑定时,可能会想要将一个字符串绑定到NavigateUri属性。但是,请不要这么做!虽然这样做不会导致应用程序崩溃,但HyperlinkButton实际上并不会工作。
这个问题有两种潜在的解决方案:
在这次的例子中,选择了第一种解决方案,因为可以轻松地访问数据模型并进行更改。但是在未来,也可能会选择第二种方案。
在进行数据绑定时,确保绑定的是一个Uri对象,而不是一个简单的字符串。如果数据模型中有一个字符串字段,需要将其转换为Uri对象。这可以通过自定义转换器来实现。
自定义转换器的实现如下:
public class StringToUriConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string uriString)
{
return new Uri(uriString);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后,在XAML中,可以这样使用这个转换器:
<HyperlinkButton Content="Titan Blog"
NavigateUri="{Binding BlogUrl, Converter={StaticResource stringToUriConverter}}"
TargetName="_blank" />