我正在尝试传递一些字符串(className& classID),并根据用户点击的超链接将它们存储在不同的变量(classNameClicked& classIDClicked)中。
这是我创建超链接的代码(C#):
TextBlock txt = new TextBlock();
txt.TextWrapping = TextWrapping.Wrap;
txt.Foreground = Brushes.Black;
txt.FontFamily = new FontFamily("Times New Roman");
txt.FontSize = 25;
txt.Margin = new Thickness(5);
TextBlock ClassID = new TextBlock();
ClassID.Visibility = Visibility.Collapsed;
ClassID.Text = classID;
Run run = new Run(className);
Hyperlink link = new Hyperlink(run);
link.Click += Link_Click;
txt.Inlines.Add(ClassID);
txt.Inlines.Add(link);
myStackPanel.Children.Add(txt);
frame.Content = myStackPanel;
我能够通过使用以下代码从超链接中提取文本,将字符串从className传递给classNameClicked:
private void Link_Click(object sender, RoutedEventArgs e)
{
classNameClicked = ((sender as Hyperlink).Inlines.FirstInline as Run).Text;
classIDClicked = (sender as Textblock).Text;
Class_Page class_page = new Class_Page();
NavigationService.Navigate(class_page);
}
但是,我似乎无法弄清楚如何从classID中提取字符串。 请帮忙。
答案 0 :(得分:2)
您只需要引用Hyperlink
的父级。
所以而不是
classNameClicked = ((sender as Hyperlink).Inlines.FirstInline as Run).Text;
classIDClicked = (sender as TextBlock).Text;
你可以写
Hyperlink link = sender as Hyperlink;
classNameClicked = (link.Inlines.FirstInline as Run).Text;
classIDClicked = (link.Parent as TextBlock).Inlines.OfType<Run>().First().Text;
如果你不想使用LINQ,你也可以写:
classIDClicked = ((link.Parent as TextBlock).Inlines.FirstInline as Run).Text;
但我在评论中与Mat有相同的整体意见。这真的很丑陋,MVVM将成为编写更清晰代码的方法。
此外,您应该添加一些空检查。
根据评论中的要求进行修改:
如果您不想在GUI中显示classID
,那么您可以将其隐藏在Tag
的{{1}}中:
Hyperlink
然后在你的Hyperlink link = new Hyperlink(run);
link.Tag = classID;
link.Click += Link_Click;
处理程序中获取它:
Click
您不需要隐藏classIDClicked = link.Tag as string;
。