WPF程序只允许一个启动在MVVMLight框架下找不到资源的问题
2012-02-10 12:24
295 查看
需求要求只有一个程序启动,OK,这个很简单,以前在Form中我们很简单就可以实现,我们考虑的就是用Mutex类来向线程授予共享资源独占访问权。但是如果使用的是WPF,还使用了MVVMLight,恭喜你,你马上要面临一个很诡异的错误,我们看下面:
我们使用net3.5,新建一个MVVMLight模板的WPF程序。如图示:
MVVM自动帮我们添加了ViewModel、Model文件夹。其中MainViewModel是MainWindow的ViewModel,ViewModelLocator是进行ViewModel和View定位文件,即指定哪个View使用哪个ViewModel。我在一般项目中一般不使用该文件,有时候很简单设置DataContex就可以绑定使用ViewModelLocator反而更麻烦。而我们今天所说的错误就来自这个ViewModelLocator。
我们先来解决单一程序启动的问题。按照以往的惯例,我们在App.xaml.cs中重写OnStartup来增加启动逻辑。看代码:
我们知道,App.xaml中已设置StartupUri="MainWindow.xaml",我们再定义时会重复,删掉StartupUri="MainWindow.xaml"后,OK,单一程序启动的逻辑我们应该没有写错,现在我们debug试一下。
public partial class App : Application { static App() { DispatcherHelper.Initialize(); } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); bool startupFlag; Mutex mutex = new Mutex(true,"BoeLottery",out startupFlag); if(!startupFlag) { MessageBox.Show("程序已经启动!"); Environment.Exit(0); } else { MainWindow mainWindow = new MainWindow(); mainWindow.Show(); mainWindow.DataContext = new MainViewModel(); } } }
复制代码
奇怪,这时候,{Locator}资源找不到了,Locator是MVVMLight自动生成的ViewModelLocator的引用名称。在App.xaml有Locator的定义。
<Application.Resources> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> </Application.Resources>
那么,好好的Locator怎么找不到了呢?我们回想一下做过了哪些操作,注释掉重写OnStartup方法后问题依旧,取消注释。对,我们还删除了StartupUri="MainWindow.xaml"这一句代码,添加回去试试,debug此时成功了,但是因为有StatupUri,这时候我们重写的内容是没有意义的。
为什么删除StartupUri会引起这样的错误呢?
我们知道StaticResource对该资源的查找行为类似于加载时查找,它会查找以前从当前 XAML 页的标记中加载的资源以及其他应用程序源,并且将该资源值生成为运行时对象中的属性值。App.cs文件中的MainWindow是重写时动态生成的,而StaticResource在这之前已经进行了数据绑定,所以抛出了Data.Binding的异常,更深层次的解释要问微软了。解决办法如下:
我们注释掉MainWindow中的DataContext="{Binding Main, Source={StaticResource Locator}}",在App.xaml.cs中
mainWindow.Show(); 一句后面添加
mainWindow.DataContext = new MainViewModel();
此时mainWindow动态生成时指定DataContext。
Debug成功。问题clear。
相关文章推荐
- WPF程序只允许一个启动在MVVMLight框架下找不到资源的问题
- WPF 启动类(窗口)移动到项目的子目录之后,无法启动程序,找不到xxx.xaml资源
- 遇到问题--Nginx---tomcat启动web程序访问静态资源时404找不到
- 遇到问题--Nginx---tomcat启动web程序访问静态资源时404找不到
- 遇到问题--Nginx---tomcat启动web程序访问静态资源时404找不到
- 遇到问题--Nginx---tomcat启动web程序访问静态资源时404找不到
- VS2017无法启动程序,系统找不到指定的路径,问题解决
- 转:解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- 在QT框架下开发MFC主程序的一个插件遇到的问题
- 运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- 局域网共享资源路径更改无法登陆问题(不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接)解决
- Cocos2d-x--新建Cocos2d-x项目出现的问题--系统无法启动程序,系统找不到指定的路径
- IIS网站已经停止,提示服务器没有及时响应启动或控制请求!本地计算机法启动 World Wide Web Publishing 服务。提示 “错误127: 找不到指定的程序”或者“错误1721,资源不足,无法启动
- Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题
- WPF 一种资源找不到的问题的解决办法
- 让一个程序运行一次,在它运行时,不允许再启动一个新的进程。
- 无法启动程序'...debug/abc.exe',系统找不到指定文件"的问题
- VS2012中出现“无法启动程序...debug\abc.exe,系统找不到指定文件”的问题!
- IIS网站已经停止,提示服务器没有及时响应启动或控制请求!本地计算机法启动 World Wide Web Publishing 服务。提示 “错误127: 找不到指定的程序”或者“错误1721,资源不足,无法启动”
- 解决”不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接“问题