В настоящее время я пишу приложение на C # и хотел бы позволить внешним VB-сценариям каким-либо образом манипулировать основанным на WPF GUI приложения.Эти сценарии должны иметь возможность работать очень долго и приостанавливать поток, в котором они запущены (это небольшое приложение, похожее на слайд-шоу, где скрипты VBS определяют содержимое представления во время выполнения).Для этого я сослался на COM-компонент ScriptControl и сделал мои классы ComVisible .Выбранный сценарий будет выполняться ScriptingHost следующим образом:
public void Run(Action callback)
{
var thread = new Thread(() =>
{
_ScriptControl.Run("Execute", new object[] { }); // _ScriptControl is the COM component
callback();
});
thread.Start();
}
Чтобы отобразить изображение в моем приложении, я использую следующий метод в моей модели представления (вызывается из VBScript):
public void ShowPicture(string path)
{
BitmapImage bmImage = new BitmapImage();
bmImage.BeginInit();
bmImage.UriSource = new Uri(path, UriKind.Absolute);
bmImage.EndInit();
bmImage.Freeze();
_CurrentImage = bmImage;
RaisePropertyChanged("CurrentImage");
// System.Windows.Forms.Application.DoEvents();
}
Свойство CurrentImage
возвращает вновь созданный BitmapImage (_CurrentImage
) и привязывается к элементу управления изображениями на моем виде.
Когда я запускаю скрипт, который приостанавливаетПоток сценариев (чтобы дать пользователю некоторое время для просмотра изображения) с помощью Thread.Sleep()
, элемент управления изображением будет по-прежнему извлекать свойство CurrentImage
после возникновения события, но изображение не будет отображаться.Если я добавлю вызов DoEvents
или MessageBox.Show
где-нибудь, графический интерфейс будет обновляться правильно.
Я попытался отобразить изображение, вызывающее метод ShowPicture
, в отдельном потоке, за которым следовали Thread.Sleep()
иэто работает хорошо (без COM-компонента ScriptControl).
Использует ли COM-компонент ScriptControl какой-либо поток пользовательского интерфейса (я уже установил AllowUI
в false
) или происходит какая-то другая загадочная работа COMon?
Пример сценария:
Function Execute()
For Each picture In Source.GetPictures(False)
Canvas.ShowPicture(picture)
Host.Wait(5) ' Thread.Sleep(5000)
Next
End Function