试图添加和显示指向对象的字符串属性的超链接

本文关键字:对象 字符串 属性 超链接 添加 显示 | 更新日期: 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添加到RichTextBoxBlocks属性中。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);
    }
}

我可能把你的视图模型的结构搞错了,但是你明白了。