Я разрабатываю специализированный просмотрщик журналов, в котором я отображаю список записей журнала в виде списка.FlowDocument/RichTextBox с гиперссылками с использованием MVVM
Приложение состоит из окна (фактически, используя Catel, так что это DataWindow), и в нем у меня есть интерфейс. Поскольку я использую MVVM, я также создал соответствующую виртуальную машину. Моя модель - это журнал, в котором есть коллекция LogEntrys. Журнал загружается в виртуальную машину при взаимодействии с пользователем.
Каждый LogEntry имеет свойство Message, которое представляет собой некоторый текст (свойство string), который я хочу проанализировать в XAML и преобразовать его части в гиперссылки. Когда пользователь нажимает на гиперссылку, я хочу выполнить некоторую команду, которая определена в главной виртуальной машине (она должна быть там, так как она использует некоторые свойства, которые принадлежат VM).
Первоначально я пытался использовать RichTextBox. Поскольку WPF не поддерживает привязку, я решил использовать RTB из Extended WPF Toolbox (here).
Я создал обычай ITextFormatter
, который читает текст и строит FlowDocument
(обратите внимание, что в ITextFormatter
FlowDocument
(параметр документа) передается в). В SetText
:
foreach (var line in text.Split('\n'))
{
//some manipulations
Paragraph para = new Paragraph();
para.Inlines.Add(new Run(manipulatedText1));
para.Inlines.Add(CreateHyperLink(manipulatedText2));
document.Blocks.Add(para);
}
CreateHyperLink
функция должна построить Hyperlink
и установить его команда и параметры:
private Hyperlink CreateHyperlink(string text)
{
var hLink = new Hyperlink(new Bold(new Run(text)));
hLink.TargetName = text;
//Attach a command and set arguments (target etc)
hLink.Command = ???
hLink.TargetName = text;
//Do some formatting
return hLink;
}
Это заставило меня на сцене, что я вижу, мое отформатированный содержание в RTB в ListView
но они только подчеркнуты, ведут себя как обычный текст и не действуют. (Добавлено вопрос here, но ответа еще нет).
Затем, пытаясь найти решение, я наткнулся на FlowDocumentScrollViewer
. Я создал IValueConverter
, которые анализируют текст (сообщение) и строят документ с помощью гиперссылки. Это кажется немного более простым и чистым решением. Используя этот подход, я получил отформатированный дисплей сообщений, и Гиперссылки распознаются как таковые (отображаются синим цветом и как единое целое), но все равно не удастся запустить команду.
Таким образом, у меня есть два вопроса:
Какой контроль является лучшим выбором, или каковы плюсы и минусы использования каждого из них?
FlowDocumentScrollViewer
неотъемлемо только для чтения и может поддерживать лучшее форматирование (?), Но она дает некоторые проблемы с прокруткойListView
с помощью мыши (когда надFlowDocumentScrollViewer
, не прокручивать список, возможно, может быть исправлено)Как мне нужно передать команду с виртуальной машины на гиперссылку с ее выполнением? Я предполагаю, что некоторые привязки должны быть выполнены, но не уверены, как/где. Я пытался создать в обоих
ITextFormatter
иIValueConverter
ICommand
DependancyProperty
и использовать его значение при визуализации FlowDocument но либо он не является законным (как экземпляр создается как статический ресурс), или я не привязывая его правильно
Я пытался (в):
<local:TextToFlowDocumentConverter
x:Key="textToFlowDocumentConverter"
HyperlinkCommand="{Binding NavigateDnHyperlinkCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type catel:DataWindow}}, Path=DataContext}"/>
Я предполагаю, что я могу создать экземпляр форматера/конвертер на виртуальной машине, но это не собственно MVVM ...
BTW, я также пытался «жесткий код» ссылку при разборе (CreateHyperLink
выше)
hLink.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(hLink_RequestNavigate);
и это не сработало, как для управления
Я дополнение, я поставил в XAML в Hyperlink.Click
и Hyperlink.RequestNavigate
(? присоединенные свойства()) и иметь их в коде окна позади - и это делает работу (Примечание: в случае RTB вы должны установить IsDocumentEnabled="True"
и IsReadOnly="True"
)
Спасибо,
Томер
Я думаю, что возможным направлением будет присоединенное свойство ... работающее над ним - обновляется позже. Если это не очень хорошая идея - я был бы рад узнать –