Contentpresenter中的跨度无法正常工作

时间:2018-12-27 14:53:40

标签: wpf

我偶然发现了一个小问题,我不确定如何避免或解决它,以及它是错误还是“功能”。

当渲染带有文本的跨度时,使用内容演示器进行渲染时似乎与逻辑树断开了连接。它不会冒泡IsMouseOver(或可能发生任何事件),并且跨度内的Hyperlinks也不会触发任何关联的代码。

<ContentPresenter>
    <ContentPresenter.Content>
        <!--Normally this would be a binding, but it behaves the same.-->
        <Span>
            Test <Hyperlink Click="Hyperlink_OnClick">Testlink</Hyperlink>
        </Span>
    </ContentPresenter.Content>
</ContentPresenter>

使用Snoop检查视觉树确实表明,用于显示跨度的TextBlock并未收到IsMouseOver-内联元素发出的事件,而它们本身确实正确地注册了它们(当您展开内联属性并导航到它们;他们只是拒绝将它们传递出去)。同样,在将消息框附加到点击处理程序时,单击链接也不会发生任何事情。

<TextBlock Grid.Row="1">
    <Span>
        Test <Hyperlink Click="Hyperlink_OnClick">Testlink</Hyperlink>
    </Span>
</TextBlock>

另一方面,此功能可以正常工作。 IsMouseOver可以正常工作,甚至链接也可以正常工作。

我的问题的前提是,我想将TextBlock的文本动态绑定到某些东西。但是我无法将文本属性直接绑定到跨度,因此我正在使用执行此工作的内容呈现器(但已损坏)。这是我不知道的错误还是某些功能/含义?还有另一种方法可以将跨度绑定到某个东西以通过有效的事件处理和超链接点击来显示它?

1 个答案:

答案 0 :(得分:2)

您可以使用返回TextBlock并将其添加到Span集合中的Inlines的转换器:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Span span = value as Span;
        TextBlock textBlock = new TextBlock();
        textBlock.Inlines.Add(span);
        return textBlock;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

XAML:

<ContentPresenter Content="{Binding Span, Converter={StaticResource MyConverter}}" />