CShark
CShark

Reputation: 1563

Span in Contentpresenter not working properly

I have stumbled upon a small problem and I'm not sure how to avoid it or work around it and whether it's a bug or a "feature".

When rendering a span with text in it, it seems to be disconnected from the logical tree when using a content presenter to render it. It does not bubble IsMouseOver (or probably any event) and Hyperlinks inside the span also won't fire any associated code.

<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>

Inspecting the visual tree with Snoop indeed shows that the TextBlock used to display the span does not receive IsMouseOver-Events from it's inline elements while they themselves do indeed register them correctly (when you expand the inline property and navigate to them; they just refuse to pass them on). Also when attaching a message box to the click handler, nothing happens when you click on the link.

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

This one on the other hand works as expected. The IsMouseOver works fine and even the Link works.

The premise of my problem is, that I want to dynamically bind the text of the TextBlock to something. But I can't bind the text-property to a span directly so I'm using a content presenter which does the job (but is broken). Is this a bug or some feature/implication that I'm unaware of? And is there another way to bind a span to something to display it with working event handling & hyperlink clicks?

Upvotes: 0

Views: 59

Answers (1)

mm8
mm8

Reputation: 169360

You could use a converter that returns a TextBlock with the Span added to its Inlines collection:

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}}" />

Upvotes: 2

Related Questions