无法找到资源名为“ViewModelLocator”例外(Cannot find resource

2019-10-18 16:50发布

我试图通过宣称它在App.xaml中的资源使用ViewModelLocator。 它是一种非常简单的类,如下所示:

public class ViewModelLocator
    {
        public ShellViewModel ShellPage
        {
            get
            {
                return new ShellViewModel();
            }
        }
}

App.xaml文件是如下:

<Application x:Class="SomeNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:SomeNamespace.ViewModels">
    <Application.Resources>
         <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>

App.xaml.cs是如下:

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var view = new ShellView();
            Current.MainWindow = view;
            Current.MainWindow.Show();            
        }
    }

ShellView.xaml是如下:

<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="SomeNamespace.ShellView"
        Title="MainWindow" 
        Height="350" 
        Width="525" 
        ResizeMode="NoResize" 
        MinWidth="700" 
        MinHeight="700"
        DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}"
        >
    <Grid>
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>
</Window>

我可以看到在Visual Studio设计正确的标题,但是当我运行应用程序,获得XamlParseException:“抛出一个异常‘System.Windows.StaticResourceExtension’上提供价值” 行号“11”和线位置“9”。

设置InnerException有{“无法找到名为‘ViewModelLocator’。资源名称是区分大小写的资源。”}

我这么想吗?

Answer 1:

尝试把它的ResourceDictionary内

<Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </ResourceDictionary>
</Application.Resources>

编辑:

我使用的应用程序启动时,而不是覆盖OnStartup解决了这个问题。

<Application x:Class="TestWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:TestWPF.ViewModels"
             Startup="App_Startup">
    <Application.Resources>
          <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>

public partial class App : Application
{
    void App_Startup(object sender, StartupEventArgs e)
    {
        var view = new ShellView();
        Current.MainWindow = view;
        Current.MainWindow.Show();
    }
}


Answer 2:

在启动时你加载窗口,这是不是在我看来,一个很好的做法,因为资源尚未完全在这两个应用程序中的女巫你的Window取决于解决。 即使你看到性能在设计时加载,这并不总是一个很好的说法,虽然设计是继另一个逻辑来执行代码。
你必须让应用程序和Windows加载,然后填写窗口的网格中的上下文属性


卸下App.xaml中的资源XAML(它看起来真的出了范围存在的),做这个:

 <Window.Resources>
        <wpfApplication1:ViewModelLocator x:Key="ViewModelLocator" />
    </Window.Resources>

    <Grid   DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}">
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>


Answer 3:

看来我发现了一个solution.The原因也许StartUrl在App.xaml

1.去除在默认StartUrl App.xaml 。这样的是这样的:

        <Application x:Class="BidingAccessories.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d"
                     xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
            <Application.Resources>
                <ResourceDictionary>
                    <vm:ViewModelLocator x:Key="Locator" xmlns:vm="clr-namespace:BidingAccessories.ViewModel" />
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary Source="pack://application:,,,/BidingCommon;component/CommonStyleDictionary.xaml" />
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </Application.Resources>
        </Application>
        </Application.Resources>
        </Application>

2.覆盖在OnstartUp事件App.xaml.cs

    protected override void OnStartup(StartupEventArgs e)
        {
            StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
    }


文章来源: Cannot find resource named 'ViewModelLocator' exception