我使用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;
Collections已成功填充,现在我将listtissuelinks视图链接到该集合。
<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,尝试了很多其他的变体,谷歌真的很多,但仍然不知道如何做到这一点。你能建议一些简单而优雅的解决方法吗?
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
(不需要在代码中构建HyperLink
)。
List<string> issueLinks = new List<string>()
{
"http://www.google.com",
"http://www.stackoverflow.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;
}
我不完全明白你的问题是什么,但我有两件事你应该知道。
-
ObservableCollection我认为你应该考虑使用它,而不是一个简单的列表,因为它有优势,如果你需要绑定列表到视图与你的ListView为例。ObservableCollection Class
-
XAML我想你们会试着解释的第二件事是如何获取属性并在列表视图中显示它们。这意味着您需要在XAML端编写它并进一步探索它,如果列表中的数据将因任何原因而更改,则可以在此之后使用inotifypropertychanged绑定属性。
希望我帮到你。