Я столкнулся с проблемой при попытке манипулировать элементом управления FlowDocumentScrollViewer в WPF.Я искал в интернете эту ошибку, но обнаружил, что моя проблема совершенно уникальна.
это код:
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, в котором нет ошибок
Но все же возникла та же проблема:попробуйте работать из другого потока.
Я не знаком с другими свойствами Dispatcher или Invoke и т. Д., Поэтому я понятия не имею, как решить эту проблему.
Если кто-нибудь может подсказать мне эту ошибку?
Спасибо!
[решено]
Спасибо 500 - Внутренняя ошибка сервера !
Поскольку я все еще в шоке от этого факта, я решил выразить свое понимание этого вопроса, чтобы облегчить кому-то еще такую же проблему и увидел этот вопрос.
Я исправил проблему.Это потому, что FlowDocument fdoc на самом деле является типом элемента управления пользовательского интерфейса и создается в другом потоке.Поэтому, когда поток главного окна хочет управлять этим fdoc - хотя он имеет разрешение на отображение FlowDocumentScrollViewer - он не имеет разрешения на другой элемент управления fdoc в этом предложении назначения.
Это довольно странно !!Я думал, что fdoc - это обычная переменная, такая как строка или int vars ...> <</p>