C# 尝试添加并显示指向对象字符串属性的超链接
我有一个对象,它当前的属性是C# 尝试添加并显示指向对象字符串属性的超链接,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我有一个对象,它当前的属性是字符串,正在代码隐藏中填充。然后将此属性绑定到一个文本块,当前显示的内容与应用程序中预期的内容完全相同。 我想做的是将字符串中的某些单词作为超链接,点击后将导航到另一个页面,但我很难实现这一点 当我将属性改为段落而不是字符串,并将文本/超链接添加为内联线,但当我将文本块绑定到段落时,它会显示.ToString()值,而不是预期的内容 我这样做对吗?有人能给我指出正确的方向吗?谢谢 增加代码; 这是我的对象创建(如果我只是向AbilityEffect添加一个字符串,那么
字符串
,正在代码隐藏中填充。然后将此属性绑定到一个文本块,当前显示的内容与应用程序中预期的内容完全相同。我想做的是将字符串中的某些单词作为超链接,点击后将导航到另一个页面,但我很难实现这一点 当我将属性改为
段落
而不是字符串
,并将文本/超链接添加为内联线
,但当我将文本块绑定到段落时,它会显示.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.paragration
而不是内容paragration
元素的TextBlock
。您需要使用RichTextBox
。您需要将其IsReadOnly
属性设置为true,否则Hyperlink
将不会处于活动状态。此外,还需要将此段落
添加到RichTextBox
的块
属性中<代码>块不是依赖项属性,因此不能对其使用数据绑定
您可以这样做:
<RichTextBox IsReadOnly="True" TextWrapping="Wrap" x:Name="rtb"/>
编辑:
您可以查看以下示例:。它使用了RichTextBox
的派生版本,并添加了一个数据绑定Text
属性
编辑2:
再想一想,我认为您可以执行以下操作来对现有代码进行最小的更改:
(1) 像以前一样使用RichTextBlock
<RichTextBox IsReadOnly="True" TextWrapping="Wrap" x:Name="rtb"/>
(3) 如果AbilityEffect2
属性发生更改,请将其添加到RichTextBlock
void OnAbilitiesdataPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AbilityEffect2")
{
rtb.Blocks.Clear();
rtb.Blocks.Add((sender as Abilities_data).AbilityEffect2);
}
}
我可能把你的viewmodel结构弄错了,但你明白了
希望这有帮助。你能分享你的代码吗?我已经添加了我的代码。干杯。谢谢你的帮助,今晚晚些时候我会试试。这是实现带有超链接的文本块的最佳/唯一方法吗?从我对WPF的理解(承认有限)来看,要么使用不支持绑定的只读输入控件,要么在中创建自己的版本和shoehorn绑定,似乎有点违反直觉。我本以为微软有一个更简单的方法来做这件事……是的,这就是方法。然而,我发现了一种更简单的方法。请参阅我更新答案的“编辑2”部分。
(this.DataContext as Abilities_data).PropertyChanged += OnAbilitiesdataPropertyChanged;
void OnAbilitiesdataPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AbilityEffect2")
{
rtb.Blocks.Clear();
rtb.Blocks.Add((sender as Abilities_data).AbilityEffect2);
}
}