Как я могу создать подкласс класса Inline? (тот, что используется в FlowDocument)

В WPF я хотел бы создать собственный Inline реализация. Из документации Inline: "Аннотация класс, который обеспечивает основу для всех встроенных элементов содержимого потока». Такие классы, как Figure, Run или Span наследовать от Inline.

Мой собственный класс, наследующий от Inline, будет что-то вроде «двухрядного бега». У меня есть особые потребности в потоке документов, и это, кажется, единственный способ. Однако я не знаю, с чего начать: Inline не определяет никаких членов! Это абстрактный класс, поэтому он предназначен для наследования, но нет документации о том, как наследовать от него. Ни в MSDN, ни где-либо еще, где я мог бы найти это.

Если вы можете предоставить некоторые онлайн-ресурсы (учебник/блог/статья) или пример кода, как создать подкласс Inline. Например, просто пустой ящик определенной ширины и высоты.

Если вы хотите знать, почему я хочу создать собственный элемент Inline, посмотрите на вопрос Создать редактор гитарных аккордов в WPF.


person Rasto    schedule 27.04.2011    source источник
comment
Если вы можете предоставить ссылку на исходный код Run или Span, это также будет чрезвычайно полезно.   -  person Rasto    schedule 27.04.2011
comment
вы можете просто использовать Reflector, чтобы увидеть код   -  person Thomas Levesque    schedule 27.04.2011
comment
@Thomas Levesque: я собирался это сделать, но это займет некоторое время, потому что я никогда раньше не использовал отражатель. Мне нужно установить его и выяснить, как его использовать.   -  person Rasto    schedule 27.04.2011
comment
Не могли бы вы вместо этого наследоваться от Run?   -  person jv42    schedule 23.12.2011


Ответы (1)


Базовые классы можно использовать просто для добавления точности типов. Например, код в обработчике FlowDocument может просто захотеть сделать такой код:

if(currentElement is Inline)
{
   // Do something
}

Inline на самом деле вообще ничего не должен делать.

Что касается подкласса от Inline, я думаю, вы не сможете достичь того, чего хотите. Насколько я понимаю, средство визуализации FlowDocument отвечает за просмотр типов элементов и интерпретацию их поведения на основе их типа и свойств. Другими словами, он ничего не знает о вашем пользовательском коде. Я думаю, что лучшее, что вы могли бы сделать, это создать подкласс полезного элемента и заставить ваш подкласс путаться со значениями свойств или чем-то, что можно переопределить.

Вы также можете добавлять прикрепленные свойства и обрабатывать дочерние элементы, определяющие эти свойства. Например, если вы хотите, чтобы контейнер гиперссылки позволял различным дочерним элементам предоставлять разные ссылки, вы могли бы создать подкласс Hyperlink, определить новое присоединенное свойство Link и обрабатывать события кликов для дочерних элементов иначе, чем сама Hyperlink.

Вы также можете добиться определенного успеха с элементами InlineUIContainer и BlockUIContainer, которые позволяют встраивать в него любой элемент UIElement, включая настраиваемые элементы UIElement.

person Kevin Hsu    schedule 29.04.2011
comment
Боюсь, прикрепленные свойства мне не помогут - я пытаюсь влиять на макет/поведение текста. И этот текст будет вести себя как текст в документе, только если он не находится ни в одном блоке (поэтому отсутствие InlineUIContainer с пользовательскими UIElements или BlockUIContainer не является правильным решением). В частности, выделение текста будет рассматривать все InlineUIContainer или BlockUIContainer как один элемент. Подробнее см. мой вопрос Создать редактор гитарных аккордов в WPF и вопросы связаны там. - person Rasto; 30.04.2011
comment
Я думаю, что вам просто не повезло в этом. Если вы найдете решение, пожалуйста, поделитесь. - person Kevin Hsu; 30.04.2011
comment
Я мог бы... Парни из WPF, которые разработали FlowDocument, кажется, забыли о гитаристах :(. Почти всегда есть решение с такими языками программирования, как C#. Просто оно может быть непростым - например, переписать половину WPF. На этот раз, похоже, я нужно написать что-то свое FlowDocument и RichTextBox до некоторой степени :((( - person Rasto; 30.04.2011
comment
@drasto Кевин прав в этом. Вы не можете изменить рендеринг любого TextElement, вы можете только создать подкласс для изменения свойств. вы должны отметить его ответ как принятый. - person Markus Hütter; 01.05.2011
comment
@Markus Hütter: После ваших последних двух ответов я уже считаю вас авторитетом, когда дело доходит до FlowDocument. Так что я, вероятно, приму ответ Кевина через некоторое время (месяц или около того). На данный момент он получает только +1 от меня. Я уже подозревал, что он прав... - person Rasto; 02.05.2011