Где найти исходники RichTextBox и FlowDocument?

390
01 февраля 2017, 23:25

Ищу исходники RichTextBox и FlowDocument.

У меня TextEditor унаследованный от RichTextBox

Свойства перекрываются этой строкой:

DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor),
                                             new FrameworkPropertyMetadata(typeof(TextEditor)));

.

public class TextEditor : RichTextBox
static TextEditor()
    {
DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor),
                                             new FrameworkPropertyMetadata(typeof(TextEditor)));

Если её закоммнтировать то контроллер работает как RichTextBox.

Но не рааботают свойства TextEditor.

Без закомметирования - контроллер работает как TextEditor. Но в него нельзя вставлять картинки.

Частично пример моего кода здесь: Как вставить картинку в RichTextBox?

public class TextEditor : RichTextBox
public sealed class TextDocument : FlowDocument
Answer 1

Набираем sourceof.net и ищем:

  • RichTextBox
  • FlowDocument

Исходники тем со стилями можно найти локально в файлах Visual Studio. Например, у 2015-ой Студии они хранятся здесь:

%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\DesignTools\SystemThemes\Wpf

А строчкой

DefaultStyleKeyProperty.OverrideMetadata(typeof(TextEditor), new FrameworkPropertyMetadata(typeof(TextEditor)));

вы перекрываете не свойства, а стиль контрола по-умолчанию: теперь он будет равен стилю, у которого TargetType выставлен в TextEditor.

Стили кастомных контролов обычно задаются в файле Generic.xaml и выглядят следующим образом:

<ResourceDictionary ...>
    <Style TargetType="{x:Type local:TextEditor}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:TextEditor}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Важно понимать, что таким стилем переопределяется не только Template (по сути — разметка контрола), а и вообще все свойства базового стиля, т.к. BasedOn по-умолчанию равен null.

Если в новом стиле нужно унаследовать некий существующий стиль (в вашем случае это стиль RichTextBox), и тем самым сохранить поведение и разметку RichTextBox, то укажите BasedOn явно, и не затирайте свойство Template:

...
<Style TargetType="{x:Type local:TextEditor}" BasedOn="{StaticResource {x:Type RichTextBox}}">
</Style>
...
READ ALSO
Как в C# правильно сравнивать строки

Как в C# правильно сравнивать строки

Как в C# правильно сравнивать строки: Equals или ==?

1011
Посоветуйте книгу либо ресурс [дубликат]

Посоветуйте книгу либо ресурс [дубликат]

На данный вопрос уже ответили:

477
Как в codeception последовательно сделать клик по нескольким элементам с зажатым &#39;shift&#39;

Как в codeception последовательно сделать клик по нескольким элементам с зажатым 'shift'

Добрый деньтребуется выделить несколько блоков кликнув по каждому, но при этом должен быть зажат shift, т

481