Silverlight. Как выровнять текст в содержимом InlineUIContainer с внешним текстом в RichTextBox

Задача: сделать текстовое содержимое InlineUIContainer встроенным в внешний текст.

Стандартное поведение содержимого InlineUIContainer заключается в том, что нижний край находится на одной линии с внешним текстом.

Можно сместить позицию InlineUIContainer с помощью RenderTransform, но значение Y нужно выбирать для каждого типа и размера шрифта - не идеальный способ.

<RichTextBox>

    <Paragraph>
        LLL
        <InlineUIContainer>
            <Border Background="LightGoldenrodYellow">
                <TextBlock Text="LLL"/>
            </Border>
        </InlineUIContainer>
        LLL
    </Paragraph>

    <Paragraph>
        LLL
        <InlineUIContainer>
            <Border Background="LightGoldenrodYellow">

                <Border.RenderTransform>
                    <TranslateTransform Y="5" />
                </Border.RenderTransform>

                <TextBlock Text="LLL"/>

            </Border>    
        </InlineUIContainer>
        LLL
    </Paragraph>

</RichTextBox>

пример

Как выровнять текст в содержимом InlineUIContainer с внешним текстом в RichTextBox независимо от типа и размера шрифта?

В WPF свойство BaselineAlignment="Center" работает нормально.

Но Silverlight, похоже, не хватает этой функциональности.

2 ответа

Решение

Я оштрафован на идеальный способ (вы можете сделать пользовательский контроль из этого):

Прежде всего, оберните ваш объект в холст...

<Paragraph>LLL
<InlineUIContainer>
    <Canvas x:Name="c" LayoutUpdated="c_LayoutUpdated">
        <Border Background="LightGoldenrodYellow">
            <TextBlock x:Name="t" FontSize="32"  Text="LLL"/>
        </Border>
    </Canvas>
</InlineUIContainer> LLL
</Paragraph>

И добавьте обработчик событий LayoutUpdated в Canvas

    private void c_LayoutUpdated(object sender, EventArgs e)
    {
        c.Width = t.DesiredSize.Width;
        c.Height = (t.DesiredSize.Height / 1.3d);         
    }

После нажатия F5 вы должны увидеть чудо:)

PS: теперь текст делай как хочешь... не важно, какие FontStyle и FontSize вы используете...

Попробуйте поиграть с Border.Margin свойство.. (попробуйте установить его в "0,-5,0,-5", или некоторые другие числа)

Другие вопросы по тегам