【发布时间】:2016-01-05 21:14:34
【问题描述】:
我的 WPF 应用程序中有一个简单的 TreeView。内容是通过编程添加几个 TreeViewItems(和子项)建立的。 现在我想在每个 TreeViewItem 中集成链接,例如 “第 1 项的文本 (http://google.de)” 链接应该是可点击的。 如何在代码中实现这一点以及如何分配处理程序来执行“超链接操作”(例如 Process.Start(linkStr) )?
【问题讨论】:
我的 WPF 应用程序中有一个简单的 TreeView。内容是通过编程添加几个 TreeViewItems(和子项)建立的。 现在我想在每个 TreeViewItem 中集成链接,例如 “第 1 项的文本 (http://google.de)” 链接应该是可点击的。 如何在代码中实现这一点以及如何分配处理程序来执行“超链接操作”(例如 Process.Start(linkStr) )?
【问题讨论】:
XAML 文件:
<Window x:Class="SOTree.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView Grid.Row="0" Grid.Column="1" Margin="30">
My Treeview Title
<TreeViewItem IsExpanded="True">
<TextBlock IsEnabled="True">Wikipedia
<Hyperlink NavigateUri="http://www.wikipedia.org" RequestNavigate="Hyperlink_RequestNavigate">
Wikipedia
</Hyperlink>
</TextBlock>
</TreeViewItem>
</TreeView>
</Grid>
后面的代码:
using System.Windows;
using System.Windows.Navigation;
namespace SOTree
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start(e.Uri.ToString());
}
}
}
希望这会有所帮助。
【讨论】:
用于树视图的 XAML
<TreeView Name="trvMenu" Margin="367,29,0.2,154.6">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type l:MenuItem}" ItemsSource="{Binding Items}">
<TextBlock>
<Hyperlink NavigateUri="{Binding Title}"
RequestNavigate="Hyperlink_RequestNavigate">
<InlineUIContainer>
<TextBlock Text="{Binding Title}" />
</InlineUIContainer>
</Hyperlink></TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
带有绑定的代码隐藏
public class MenuItem
{
public MenuItem()
{
this.Items = new ObservableCollection<MenuItem>();
}
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
public string Title { get; set; }
public ObservableCollection<MenuItem> Items { get; set; }
}
public partial class MainWindow : Window
{
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
public MainWindow()
{
InitializeComponent();
MenuItem root = new MenuItem() { Title = "Menu" };
MenuItem childItem1 = new MenuItem() { Title = "http://www.google.com" };
childItem1.Items.Add(new MenuItem() { Title = "http://www.google.com" });
childItem1.Items.Add(new MenuItem() { Title = "http://www.google.com" });
root.Items.Add(childItem1);
root.Items.Add(new MenuItem() { Title = "http://www.google.com" });
trvMenu.Items.Add(root);
}
}
【讨论】: