当我在单独的线程中运行FlowDoc时,我得到了异常,即使使用dispatcher invok也不能解决问题。我读了一些关于将flowdoc序列化为xdoc并重新序列化的文章,但这听起来有点麻烦。这个问题我已经解决了两天了,我的头都裂了,请帮帮忙:)
下面是我后面的代码
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绑定到了文档属性:
<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" />谢谢。
发布于 2018-07-30 15:16:22
好的,坏消息是RTB不直接支持数据绑定。MSDN网站上有一个页面解释了他们为什么这样做,但无论哪种方式,这都是一个经过深思熟虑的设计决定。
据我所知,你有两个选择。第一个是推出你自己的解决方案。这基本上涉及到为您想要显示的所有项目类型创建视图模型,在视图模型中维护它们的集合,并使用行为绑定到它并填充RTB。您的行为还必须手动设置绑定,即,而不是这样:
para.Inlines.Add(new Bold(new Run("This is a Title \n")));相反,...you会这样做:
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));本例中的...which为text属性添加了一个绑定。如果正确实现,这将允许您在加载时在GUI线程中创建文档本身,然后允许您在任何您喜欢的线程中更新文本、颜色等的视图模型属性,而不必重新创建整个文档。
第二种选择是使用其他人已经为您完成此工作的库,为此,我建议您查看WPF Tookkit's implementation of a bindable RichTextBox。
https://stackoverflow.com/questions/51583904
复制相似问题