我目前正在用C#编写应用程序,并希望允许外部VB脚本以某种方式操作应用程序的基于WPF的GUI。应该允许这些脚本运行很长时间并暂停它们运行的线程(这是一个像应用程序那样的幻灯片放映,其中VBScripts在运行时确定视图的内容)。为此,我引用了 ScriptControl COM组件并使我的类 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
,GUI将正确更新。
我试图在一个单独的线程中显示一个调用ShowPicture
方法的图像,然后是Thread.Sleep()
,这样做效果很好(没有ScriptControl COM组件)。
ScriptControl COM组件是否以某种方式使用UI线程(我已将AllowUI
设置为false
)或是否还有其他一些神秘的COM内容?
示例脚本:
Function Execute()
For Each picture In Source.GetPictures(False)
Canvas.ShowPicture(picture)
Host.Wait(5) ' Thread.Sleep(5000)
Next
End Function