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