我有一个EditorViewModel
,其中包含一个AvalonEditor控件。我绑定了SelectionLength
的{{1}}和SelectionStart
属性,每个人都很开心;我可以用鼠标选择文本,更新代码隐藏值,反之亦然。这是问题,我正在调用一个C ++ DLL,它通过回调将错误编组回调用C#代码,这也很好用。执行此操作的代码是
Document
在// Note, I need the call back to run on the main UI thread.
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Callbacks.CompilerErrorCallback =
(message, documentPath, lineNumber) =>
{
string path = String.Empty;
Task.Factory.StartNew(async () =>
{
// Open the erronious file and scroll to line.
path = Path.Combine(
WorkingDirectory, String.Format("GDLCode\\{0}", documentPath));
Open(path);
//EditorViewModel evm = GetOpenEditorViewModels()
// .FirstOrDefault(vm => vm.FullFilePath.CompareNoCase(path));
//if (evm != null)
//{
// ActivateItem(evm);
// evm.SelectLine(lineNumber + 1);
//}
// Display error.
await dialogManager.ShowDialog<MessageDialogResult>(
new MessageBoxViewModel("GDECore Logic Compilation Error",
message,
settings));
return;
}, CancellationToken.None,
TaskCreationOptions.None,
scheduler);
};
// Run the C++ code below and pass in the `Callbacks.CompilerErrorCallback` object.
我有
EditorViewModel
编译器(C ++代码)遇到编译错误并使用回调。这应该打开有问题的代码文件并突出显示有问题的行。回调有效且参数正确但是,注释的代码(应该选择违规行)不起作用。它进入public void SelectLine(int lineNumber)
{
DocumentLine line = Document.GetLineByNumber(lineNumber);
SelectionStart = line.Offset;
SelectionLength = line.Length;
}
并设置SelectLine
投掷和SelectionLength
来自AvalonEdit;看起来ArgumentOutOfRangeException
没有绑定到底层的AvalonEditor控件。
然而,当我对违规代码进行评论并添加一个按钮来进行选择时,手动&#39;代码文件打开后
EditorViewModel
选择工作正常。为什么AvalonEditor控件似乎没有在回调中立即绑定到我的属性,我正在做的事情显然是错误的吗?
答案 0 :(得分:1)
你能否确认它在UI线程上被回调?
如果你在任务中有一个bresak点,VS调试器中的线程窗口会告诉你什么?
我会考虑使用Dispatcher.Invoke方法而不是Task:
Application.Current.Dispatcher.Invoke(() =>
{
// to do something
});
就个人而言,我会考虑使用Reactive Extensions(Rx .Net)来完成所有这些工作,它能够比任务IMO更好地管理调度程序。