试图添加和显示指向对象的字符串属性的超链接
本文关键字:对象 字符串 属性 超链接 添加 显示 | 更新日期: 2023-09-27 18:18:51
我有一个对象,它目前有一个属性是String
,并且正在后面的代码中填充。这个属性然后被绑定到一个文本块,并在应用程序中精确地显示。
我想做的是有字符串中的某些词作为超链接,这将导航到另一个页面时点击,但我有困难实现这一点。
我认为当我将属性更改为Paragraph
而不是String
时,我已经弄清楚了,并将文本/超链接添加为Inlines
,但是当我将文本块绑定到段落时,它显示.ToString()
值,而不是预期的内容。
我这样做对吗?有人能给我指个正确的方向吗?谢谢。
代码添加;这是我的对象创建(如果我只是添加一个字符串到AbilityEffect
然后它工作良好如上所述),有两种方法试图获得一个超链接工作,这两种方法都没有达到我想要的;
Paragraph tempparagraph = new Paragraph();
tempparagraph.Inlines.Add(new Run {Text = "Each turn the model may count one "});
tempparagraph.Inlines.Add(CreateActionHyperlink("Climb"));
tempparagraph.Inlines.Add(new Run {Text = " or one "});
tempparagraph.Inlines.Add(CreateActionHyperlink("Sprint"));
tempparagraph.Inlines.Add(new Run {Text = " action as a short action instead of a long actioin. The model may take a "});
tempparagraph.Inlines.Add(CreateActionHyperlink("Move"));
tempparagraph.Inlines.Add(new Run {Text = " action as normal."});
data.Abilities.Add(new Abilities_data
{
AbilityName = "Agile",
AbilityEffect = "Each turn the model may count one " + new HyperlinkButton
{
Content = "Climb",
NavigateUri = new Uri("/Views/Actions_Data.xaml?name=Climb", UriKind.RelativeOrAbsolute)
}
+ " or one " + new HyperlinkButton
{
Content = "Sprint",
NavigateUri = new Uri("/Views/Actions_Data.xaml?name=Sprint",UriKind.RelativeOrAbsolute)
}
+ " action as a short action instead of a long action. The model may take a " + new HyperlinkButton
{
Content = "Move",
NavigateUri = new Uri("/Views/Actions_Data.xaml?name=Move",UriKind.RelativeOrAbsolute)
}
+ " action as normal.",
AbilityEffect2 = tempparagraph
});
和CreateAction方法;
private Hyperlink CreateActionHyperlink(string actionname)
{
Hyperlink linky = new Hyperlink();
linky.Inlines.Add(actionname);
linky.NavigateUri = new Uri("/Views/Actions_Data.xaml?name=" + actionname,UriKind.RelativeOrAbsolute);
return linky;
}
和我的xaml绑定;
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ScrollViewer>
<TextBlock Text="{Binding AbilityEffect2}"
Style="{StaticResource PhoneTextNormalStyle}"
TextWrapping="Wrap"/>
</ScrollViewer>
</Grid>
输出System.Windows.Documents.Paragraph
而不是内容
Paragraph
元素与TextBlock
不兼容。您需要使用RichTextBox
。您需要将其IsReadOnly
属性设置为true,否则Hyperlink
将不会被激活。另外,您需要将这个Paragraph
添加到RichTextBox
的Blocks
属性中。Blocks
不是一个依赖属性,所以你不能对它使用数据绑定。
你可以这样做:
<RichTextBox IsReadOnly="True" TextWrapping="Wrap" x:Name="rtb"/>
和
Paragraph tempparagraph = new Paragraph();
tempparagraph.Inlines.Add(new Run { Text = "Each turn the model may count one " });
tempparagraph.Inlines.Add(CreateActionHyperlink("Climb"));
.........
rtb.Blocks.Add(tempparagraph);
编辑:你可以看看这个例子:绑定文本链接到RichTextBox。它使用RichTextBox
的派生版本,并添加了一个数据可绑定的Text
属性。
编辑2:
经过仔细考虑,我认为您可以做以下操作来对现有代码进行最小的更改:
(1)使用之前的RichTextBlock
<RichTextBox IsReadOnly="True" TextWrapping="Wrap" x:Name="rtb"/>
(2)在cs文件中为您的页面添加视图模型的PropertyChanged
事件的处理程序。
(this.DataContext as Abilities_data).PropertyChanged += OnAbilitiesdataPropertyChanged;
(3)如果AbilityEffect2
属性发生变化,则将其添加到RichTextBlock
。
void OnAbilitiesdataPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AbilityEffect2")
{
rtb.Blocks.Clear();
rtb.Blocks.Add((sender as Abilities_data).AbilityEffect2);
}
}
我可能把你的视图模型的结构搞错了,但是你明白了。