为什么ServiceLocator.Current.GetInstance导致UserControls在设计时不起作用?

时间:2015-06-24 20:46:41

标签: wpf visual-studio xaml design-time service-locator

我遇到了一个问题,如果我在项目中的任何地方调用ServiceLocator.Current.GetInstance(type),它会导致整个项目中的UserControl在Visual Studio中的设计时停止在其他控件中实例化。但是,这些控件在运行时工作正常。

通过使用以下3个类创建一个简单的WpfApplication可以重现它。 第一次构建将成功,设计师将显示正常。但是,如果 rebuild ,它会抛出错误,设计器会停止在其他控件中实例化UserControls。由于这种行为,它似乎是一个Visual Studio错误,但我不确定。

取消注释时,ServiceLocator的#GetInstance(Type type)函数会在错误列表Cannot locate resource 'controls/test.xaml中导致错误,并且设计器会显示Test UserControl应该出现的错误Cannot create an instance of "Test"。评论时,没有错误。

测试xaml类。

<UserControl x:Class="XamlTest.Controls.Test"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d">
    <Grid>
        <Label Content="Test"/>
    </Grid>
</UserControl>

MyView xaml类。 (使用测试)

<UserControl x:Class="XamlTest.Views.MyView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mycontrols="clr-namespace:XamlTest.Controls"
             mc:Ignorable="d">
    <Grid>
        <mycontrols:Test/>
    </Grid>
</UserControl>

与使用ServiceLocator.Current.GetInstance(type);

的UserControl无关的类
using Microsoft.Practices.ServiceLocation;

namespace XamlTest.SomeClasses
{
    class SomeClass
    {
        public void SomeFunction()
        {
            // Causes Test xaml class to not instantiate at design time within MyView.
            // Does not matter what parameters you give the function.
            // Notice this class isn't even associated with any other class,
            //  and is never called, but it still causes problems.
            ServiceLocator.Current.GetInstance(null);
        }

    }
}

0 个答案:

没有答案