Как выровнять текст по нижнему краю в WPF RichTextBox

Как я могу выровнять текст по нижнему краю в RichTextBox? Кажется, что управление не поддерживает это напрямую. Поэтому я ищу способы подражать этому. В идеале я бы установил фиксированную границу элемента управления и конец текста, выровненный по нижней части.


person Alfa07    schedule 31.05.2011    source источник


Ответы (1)


Текст поступает из ScrollViewer с именем PART_ContentHost внутри шаблона управления по умолчанию для TextBoxBase, который обернут RichTextBox. Вы должны переопределить шаблон элемента управления и либо сделать так, чтобы ScrollViewer объявил свой VerticalAlignment как Bottom, либо привязать его шаблон к VerticalContentAlignment.

Ниже я сделал последнее. Это модифицированная версия шаблона элемента управления по умолчанию, взятого из Blend. Единственное изменение, которое я сделал, это добавить VerticalAlignment="{TemplateBinding VerticalAlignment}" в ScrollViewer.

(Также обратите внимание, что он ссылается на Microsoft_Windows_Themes, который определяется как xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"

Я не уверен, как это будет работать, если на машине пользователя нет Aero)

<Style x:Key="BottomAlignedTextBoxBaseStyle" 
       TargetType="TextBoxBase"
       BasedOn="{StaticResource {x:Type TextBoxBase}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBoxBase}">
                <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd"
                                                        BorderBrush="{TemplateBinding BorderBrush}"
                                                        BorderThickness="{TemplateBinding BorderThickness}"
                                                        Background="{TemplateBinding Background}"
                                                        RenderMouseOver="{TemplateBinding IsMouseOver}"
                                                        RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"                                                       SnapsToDevicePixels="true">
                    <ScrollViewer x:Name="PART_ContentHost"
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Microsoft_Windows_Themes:ListBoxChrome>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter Property="Background"
                                TargetName="Bd"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Затем, чтобы использовать его, просто скажите:

<RichTextBox Style="{StaticResource BottomAlignedTextBoxBaseStyle}" 
             VerticalContentAlignment="Bottom" />
person Adrian    schedule 31.05.2011
comment
Я попытался изменить свойство с помощью WPF Inspector, и это не сработало! Вы пробовали? - person Alfa07; 02.06.2011
comment
Извините, у меня была опечатка в атрибуте BasedOn стиля. Попробуй это сейчас? - person Adrian; 02.06.2011
comment
Это единственное элегантное решение во всем Интернете. Стоит ли рассчитывать на наличие PresentationFramework.Aero на всех компьютерах или стоит встроить эти 200 килобайт в проект? - person florien; 01.11.2018