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 има късмет с тази функционалност.


person Vadim Loboda    schedule 09.03.2011    source източник


Отговори (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 използвате...

person obenjiro    schedule 09.03.2011
comment
Благодаря ви за отделеното време и упоритостта! Вие сте истински магьосник! Работи както си мечтаех. Как го намерихте? Какъв е магическият коефициент 1.3d? Откъде дойде? - person Vadim Loboda; 10.03.2011
comment
1.3d вероятно е свързан с dpi и връзката между 72 dpi и 96 dpi. - person Default; 08.04.2013
comment
Благодаря. Това е много близо до това, което се опитвах да направя. В моя случай платното да е 0,75 от височината и намаляването на шрифта вътре в текстовия блок до 0,75 от околния текст в RichTextBox ми даде желания ефект да имам етикет, вграден в моя текст. - person froggythefrog; 29.12.2013

Опитайте да играете със свойството Border.Margin.. (опитайте да го зададете на "0,-5,0,-5" или някои други числа)

person obenjiro    schedule 09.03.2011
comment
Като зададете свойството за граница на границата на 0,-5,0,-5, вие казвате, че не искам „граница“ да запълва 5 пиксела отгоре и 5 пиксела отдолу, оставете това място за други контроли, но все пак нарисувайте „граница“ - person obenjiro; 09.03.2011
comment
Свойството Margin работи като RenderTransform - още един начин да направите същото. Ако типът или размерът на шрифта се промени, това ще изисква различна стойност на полето. Идеята да се използва конвертор тук също не е решение - каква функция за преобразуване на типа и размера на шрифта в отрицателен марж? - person Vadim Loboda; 09.03.2011