簡體   English   中英

多線程FlowDocument

[英]Multithreaded FlowDocument

當我在單獨的線程中運行FlowDoc時出現異常,即使使用調度程序調用也無法解決問題。 我讀了一些有關將flowdoc序列化為xdoc並進行序列化的文章,但這聽起來很麻煩。 我已經遇到這個問題了2天了,我的頭已經裂了,請幫助:)

這是我的代碼

 new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;
            for (int i = 0; i < 10; i++)
            {
                 mcFlowDoc = new FlowDocument();
                 // Create a paragraph with text
                 Paragraph para = new Paragraph();
                 para.Inlines.Add(new Bold(new Run("This is a Title \n")));
                 para.Inlines.Add(new Run("I am a flow document. Would you like to edit me? \n"));

                 Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
                 {
                    mcFlowDoc.Blocks.Add(para);
                 }));
            }
        }).Start();

然后是我的XAML,我只使用普通的RichTextBox並將flowdoc綁定到Document屬性:

<fsrtb:FsRichTextBox x:Name="EditBox" Document="{Binding mcFlowDoc}" Grid.Row="0" Margin="10,10,10,91" ToolbarBackground="#FFD2CB84" ToolbarBorderBrush="#FFC6BE75" ToolbarBorderThickness="1,1,1,0" CodeControlsVisibility="Collapsed" />

謝謝。

好的,不好的消息是RTB不直接支持數據綁定。 MSDN網站上的某處有一個頁面,解釋了為什么他們這樣做,但是無論哪種方式都是有意的設計決定。

據我所知,您有兩種選擇。 首先是推出您自己的解決方案。 這基本上涉及為要顯示的所有項目類型創建視圖模型,在視圖模型中維護它們的集合,並使用行為綁定到該模型並填充RTB。 您的行為還必須手動設置綁定,即代替此操作:

para.Inlines.Add(new Bold(new Run("This is a Title \n")));

...您將改為執行以下操作:

var binding = new Binding
{
    Path = new PropertyPath("BackgroundProperty"),
    Mode = BindingMode.OneWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
    };
var run = new Run();
BindingOperations.SetBinding(run, Run.TextProperty, binding);
para.Inlines.Add(new Bold(run));

...在這種情況下,將為text屬性添加一個綁定。 我想這可以通過使用DataTemplates指定要用於每個視圖模型元素的控件並指定XAML等中的綁定來大大簡化。如果實現正確,這將允許您在加載時一次在GUI線程中創建文檔本身,然后允許您在任意線程中更新文本,顏色等的視圖模型屬性,而無需重新創建整個文檔。

第二種選擇是使用其他人已經為您完成此工作的庫,為此,我建議您看一下WPF Tookkit的可綁定RichTextBox實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM