リスト ビューにログ エントリのリストを表示する特殊なログ ビューアを開発しています。
アプリケーションは Window で構成され (実際にはCatelを使用しているため、DataWindow です)、その中に UI があります。私はMVVMを使用しているので、対応するVMも作成しました。私のモデルは、LogEntry のコレクションを持つログです。ログは、ユーザーの操作時に VM にロードされます。
各 LogEntry には、XAML に解析し、その一部をハイパーリンクに変換するテキスト (文字列プロパティ) である Message プロパティがあります。ユーザーがハイパーリンクをクリックすると、メイン VM で定義されているコマンドを実行したいと思います (VM に属するいくつかのプロパティを使用するため、そこにある必要があります)。
最初に、RichTextBox を使用しようとしました。WPF はバインドをサポートしていないため、Extended WPF Toolbox (ここ) の RTB を使用することにしました。
ITextFormatterテキストを読み取ってビルドするカスタムを作成しました((ドキュメント パラメータ) が渡されるFlowDocumentことに注意してください)。で:ITextFormatterFlowDocumentSetText
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が、下線が引かれているだけで、通常のテキストとして動作し、アクションはありません。(ここに質問を投稿しましたが、まだ回答がありません)。
次に、解決策を見つけようとしたときに、FlowDocumentScrollViewer. IValueConverterテキスト (メッセージ) を解析し、ハイパーリンクを含むドキュメントを作成する を作成しました。これは、少しシンプルでクリーンなソリューションのようです。このアプローチを使用すると、フォーマットされたメッセージ表示が得られ、ハイパーリンクはそのように認識されます (青色で「全体」ユニットとして表示されます) が、コマンドを起動するのにまだ運がありません。
したがって、私は2つの質問があります:
どちらのコントロールを選択するのが良いですか、またはそれぞれを使用することの長所と短所は何ですか?
FlowDocumentScrollViewerは本質的に読み取り専用であり、より適切な書式設定をサポートしている可能性があります (?) がListView、マウスを使用したスクロールでいくつかの問題が発生します ( の上にある場合FlowDocumentScrollViewer、リストをスクロールしません。修正できる可能性があります)。VM からハイパーリンクにコマンドを渡して実行するにはどうすればよいですか? 何らかのバインディングを行う必要があると思いますが、方法/場所がわかりません。FlowDocument をレンダリングするときに との両方で作成してその値を使用しようとしました
ITextFormatterが、(インスタンスが静的リソースとして作成されるため) 正しくないか、正しくバインドしていません。IValueConverterICommandDependancyProperty
私は(で)試しました:
<local:TextToFlowDocumentConverter
x:Key="textToFlowDocumentConverter"
HyperlinkCommand="{Binding NavigateDnHyperlinkCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type catel:DataWindow}}, Path=DataContext}"/>
VMでフォーマッター/コンバーターをインスタンス化できると思いますが、それは適切なMVVMではありません...
ところで、解析時にリンクを「ハードコード」しようとしました(CreateHyperLink上記)
hLink.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(hLink_RequestNavigate);
これは両方のコントロールでは機能しませんでした
さらに、XAML でHyperlink.Clickand Hyperlink.RequestNavigate(添付プロパティ(?)) を設定し、それらをウィンドウのコード ビハインドに配置します。これは機能します (注: RTB の場合は、and を設定する必要がIsDocumentEnabled="True"ありIsReadOnly="True"ます)。
ありがとう、
トマー