у меня есть EditorViewModel
который содержит элемент управления AvalonEditor. Я связываю с SelectionLength
а также SelectionStart
свойства Document
и все счастливы; Я могу выбрать текст как мышью, которая обновляет значения кода, так и наоборот. Вот проблема, я вызываю C ++ DLL, которая отправляет ошибки обратно в вызывающий код C # через обратный вызов, это тоже хорошо работает. Код для этого
// 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
я имею
public void SelectLine(int lineNumber)
{
DocumentLine line = Document.GetLineByNumber(lineNumber);
SelectionStart = line.Offset;
SelectionLength = line.Length;
}
Компилятор (код C ++) обнаруживает ошибку компиляции и использует обратный вызов. Предполагается, что это откроет файл с нарушением кода и выделит строку с нарушением. Обратный вызов работает, и параметры правильны, однако код, который закомментирован (который должен выбрать ошибочную строку), не работает. Это входит в SelectLine
и при настройке SelectionLength
броски и ArgumentOutOfRangeException
от AvalonEdit; это выглядит как EditorViewModel
не привязан к базовому элементу управления AvalonEditor.
Тем не менее, когда я закомментирую код ошибки и добавлю кнопку, чтобы сделать выбор «вручную» после открытия файла кода
public void Test()
{
EditorViewModel evm = GetOpenEditorViewModels().FirstOrDefault();
if (evm != null)
{
ActivateItem(evm);
evm.SelectLine(1);
}
}
Выбор работает отлично. Почему элемент управления AvalonEditor, по-видимому, не связывается с моими свойствами сразу в обратном вызове, что я делаю, что явно неправильно?
Можете ли вы подтвердить, что он вызывается обратно в потоке пользовательского интерфейса?
О чем говорит окно потоков в отладчике VS, если у вас есть точка взлома в задании?
Я хотел бы рассмотреть возможность использования метода Dispatcher.Invoke вместо Task:
Application.Current.Dispatcher.Invoke(() =>
{
// to do something
});
Лично я бы посмотрел на использование Reactive Extensions (Rx .Net), чтобы сделать все это, у него есть способность управлять планировщиками намного лучше, чем Задача IMO.