我使用WPF实现了一系列超链接元素:
var controlLinks = new List<Hyperlink>();
if (issueLinks != null)
{
foreach (var link in issueLinks)
{
var tempLink = new Hyperlink()
{
NavigateUri = new Uri(link.link)
};
controlLinks.Add(tempLink);
}
}
ListIssueLinks.ItemsSource = controlLinks;
集合已成功填充,现在我将ListIssueLinks视图链接到该集合.
<ListView Name="ListIssueLinks" Height="100" >
<ListView.View>
<GridView>
<GridViewColumn/>
</GridView>
</ListView.View>
</ListView>
在这里,我遇到了一个问题,问题是我是WPF的新手,不知道如何正确实现格式设置(例如,仅在UI上显示NavigateUri或Name)并实现用于单击任何元素的通用处理程序.像这样:
private void Hyperlink_OnClick(object sender, RoutedEventArgs e)
{
var clickedLink = (Hyperlink) sender;
System.Diagnostics.Process.Start(clickedLink.NavigateUri.ToString());
}
我尝试了DataTemplate,尝试了许多其他变体,用Google搜索了很多,但是仍然不知道如何做到这一点.您能否提出任何简单而优雅的解决方案?
解决方法:
DataTemplate是最好的选择,这是在您的情况下实现它的方法.
<ListView Name="ListIssueLinks" Height="100">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink NavigateUri="{Binding}" RequestNavigate="Link_RequestNavigate">
<TextBlock Text="{Binding}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
然后,在后面的代码中,我将直接直接绑定到您的issueLinks(无需在代码中构建HyperLinks).
List<string> issueLinks = new List<string>()
{
"http://www.google.com",
"http://www.*.com",
};
ListIssueLinks.ItemsSource = issueLinks;
然后,您的RequestNavigate事件处理程序需要启动流程
private void Link_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}