Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试添加并显示指向对象字符串属性的超链接_C#_Xaml_Windows Phone 8 - Fatal编程技术网

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);
    }
}