我在尝试操作WPF中的 FlowDocumentScrollViewer 控件时遇到了一个问题。我通过互联网搜索了这种错误,但发现我的问题非常独特。
这是代码:
delegate void delg_FlowDoc(FlowDocument fdoc);
//Function provided for both internal calling and outside calling
public void setfDocDisplay(FlowDocument fdoc)
{
FlowDocumentScrollViewer display = this.fDocDisplay; //control to be operated
if (display.Dispatcher.CheckAccess())
{
//called from own thread, just operate directly!
string debug_check_ThreadName = Thread.CurrentThread.Name;
if (debug_check_ThreadName == "Thread_MainUI")
{
//Debug only, now current thread MUST be the thread
//created the UI!!!!
display.Document = fdoc; //<-- Error this line
}
}
else
{
//called from other threads, use Invoke()!
delg_FlowDoc pFun = new delg_FlowDoc(setfDocDisplay);
this.Dispatcher.Invoke(pFun, new object[] { fdoc });
//display.Dispatcher.Invoke(pFun, new object[] { fdoc });
//this.Dispatcher.BeginInvoke(pFun, new object[] { fdoc });
}
}
行display.Document = fdoc;
发生错误,说仍然无法从其他线程访问该控件。
这是错误的详细快照:
我很困惑,因为:
我已经执行display.Dispatcher.CheckAccess()
以确保当前线程有权在控件显示屏上操作。
我再次添加一个debug_check_ThreadName
以确保它在当前正确的线程中。
我在另一个没有错误的WPF项目中尝试了完全相同的代码
但仍然遇到同样的问题,告诉我我尝试从不同的线程进行操作。
我不熟悉调度程序或调用等属性的其他属性,因此我现在不知道要解决此问题。
如果有人能给我任何关于这个错误的提示吗?
谢谢!
[解决]
谢谢 500 - 内部服务器错误!
由于我仍然对这个事实感到震惊,所以我决定在问题中加入我的理解,以便其他人有同样的问题并看到这个问题。
我现在已经解决了这个问题。这是因为 FlowDocument fdoc 实际上是一种UI控件,并在另一个线程中创建。因此,当主窗口线程想要操作该fdoc时 - 虽然它具有 FlowDocumentScrollViewer显示的权限 - 但它没有对此分配句中的其他控件 fdoc 的权限。
这很奇怪!!我认为fdoc只是一个普通的变量,如字符串或int vars ...&gt;&lt;
答案 0 :(得分:4)
这不是您(尝试)分配给那个问题的控件 - 它是未在UI线程上创建的源文档。