繁体   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