我正在開發中,我在列表視圖中顯示的日誌條目列表一些專門的日誌查看器超鏈接。的FlowDocument/RichTextBox的使用MVVM
應用程序由一個窗口(實際上,使用Catel,所以這是一個數據窗口),並在其中我有UI。由於我使用MVVM,我還創建了相應的VM。我的模型是具有LogEntrys集合的日誌。日誌在用戶交互時加載到VM中。
每個LogEntry具有欲解析成XAML和變換它的部分爲超鏈接消息屬性,它是一些文本(字符串屬性)。當用戶單擊超鏈接時,我想執行一些在主虛擬機中定義的命令(必須在那裏,因爲它使用了屬於虛擬機的一些屬性)。
起初我試圖使用的RichTextBox。由於WPF一個不支持綁定我決定從擴展WPF工具箱(here)使用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;
}
這讓我來,我看到在ListView
我在RTB格式化內容的階段但它們只是加下劃線,表現爲普通文本並且沒有任何操作。 (發佈的問題here,但沒有答案)。
然後,試圖找到一個解決方案,我偶然發現了FlowDocumentScrollViewer
時。我創建了一個IValueConverter
解析文本(消息)並用超鏈接構建文檔。這似乎是一個更簡單,更清潔的解決方案。使用這種方法,我得到了格式化的消息顯示,並且超鏈接被識別爲這樣(以藍色和「整個」單位出現),但仍然沒有運行命令來觸發。
因此,我有兩個問題:
其中控制是更好的選擇,或者有什麼用每個人的優點和缺點?
FlowDocumentScrollViewer
本質上是隻讀的,可以支持更好的格式(?),但它確實給一些問題,用鼠標滾動ListView
(當在FlowDocumentScrollViewer
,它不會滾動列表,也許可以是固定的)如何我是否需要將命令從VM傳遞到超鏈接並執行?我假設一些綁定應該完成,但不知道如何/在哪裏。我想在這兩個
ITextFormatter
和IValueConverter
創建ICommand
DependancyProperty
和渲染的FlowDocument,但要麼是不合法的(作爲實例爲靜態資源創建)或我不正確綁定它
時使用它的價值我試過(中):
<local:TextToFlowDocumentConverter
x:Key="textToFlowDocumentConverter"
HyperlinkCommand="{Binding NavigateDnHyperlinkCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type catel:DataWindow}}, Path=DataContext}"/>
我想我可以實例化虛擬機上的格式化/轉換器,但是這不是正確的MVVM ...
順便說一句,我也解析(上CreateHyperLink
)
hLink.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(hLink_RequestNavigate);
時,這並沒有爲這兩個控件工作
我除了試圖「硬編碼」的鏈接,我在XAML的Hyperlink.Click
設置和Hyperlink.RequestNavigate
(?附加屬性()),並讓他們在窗口的代碼背後 - 這不工作(注:在RTB的情況下,你必須設置IsDocumentEnabled="True"
和IsReadOnly="True"
)
謝謝,
Tomer
我認爲,一個可能的方向將是一個附加屬性...它的工作 - 更新後。如果這不是一個好主意 - 我很樂意知道 –