我是Caliburn micro的新手,正在尝试在Excel插件中使用它。我实际上是用ExcelDna来实现插件的。我已经设置了引导程序,并且能够在对话框中正确运行测试应用程序。一切都像预期的那样工作。
然后,我尝试在一个单独的线程中运行Window/MainForm,因为出于各种原因,我不希望它在Excel的主线程上运行。然后,NotifyOfPropertyChanged仅为CanSayHello抛出以下错误:
{“将调用调度到UI线程时出错”}{“调用线程无法访问此对象,因为另一个线程拥有它。”}
NotifyOfPropertyChange(() => Name)工作正常,没有任何问题。
然后,我尝试在新线程中初始化启动程序,这实际上使其正常工作。但是,如果我关闭wpf窗口并从我的excel菜单重新打开,我得到一个错误,我无法初始化启动程序,因为“已经添加了一个具有相同键的项”。
有什么建议吗?
弗兰克
代码:
using Caliburn.Micro;
using ExcelDna.Integration;
using ExcelDNACMTest.ViewModels;
using System.Threading;
public class myBootstrapper:BootstrapperBase
{
public myBootstrapper() :base(false)
{
}
}
public class ProgramStart : IExcelAddIn //(this is ExcelDNA)
{
static Thread threadProgramWindow;
static readonly MainViewModel ViewModel = new MainViewModel();
static IWindowManager windowManager = new WindowManager();
public void AutoOpen() //ExcelDNA - runs at start of xll
{
var BS = new myBootstrapper();
BS.Initialize();
var myThread = new Thread(() =>
{
windowManager.ShowDialog(new MainViewModel());
}
);
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
}
public void AutoClose()
{
}
//ViewModels
class NameViewModel : PropertyChangedBase
{
string name;
public string Name
{
get { return name; }
set
{
name = value;
NotifyOfPropertyChange(() => Name);
NotifyOfPropertyChange(() => CanSayHello); //error here
}
}
public bool CanSayHello
{
get { return !string.IsNullOrWhiteSpace(Name); }
}
public void SayHello()
{
MessageBox.Show(string.Format("Hello {0}!", Name));
}
}
public class MainViewModel : Conductor<object>
{
public void ShowPageOne()
{
ActivateItem(new NameViewModel());
}
}发布于 2016-06-16 17:31:05
首先,你不需要额外的线程。
static IWindowManager windowManager = new WindowManager();打电话
IOC.Get<IWindowManager>();在.Inizialize()调用之后获取窗口管理器,这样您就可以获得正确的窗口管理器。
这应该能起到作用。
从弗兰克到弗兰克..。
https://stackoverflow.com/questions/33086105
复制相似问题