C# ';TypeNotRegisteredException';在尝试使用';IUICompositionService';接口

C# ';TypeNotRegisteredException';在尝试使用';IUICompositionService';接口,c#,wpf,mvvm,catel,C#,Wpf,Mvvm,Catel,在我的WPF MVVM Catel应用程序中使用“IUICompositionService”接口时,我有“TypeNotRegisteredException”。下面我将展示如何使用它。我需要在应用程序主窗口中可视化“CalibrationView”视图。为此,我在应用程序的主窗口中创建了一个按钮“btnShowCalibrationView”,请参见下面的XAML: <catel:Window x:Class="FlowmeterConfigurator.Views.MainWindo

在我的WPF MVVM Catel应用程序中使用“IUICompositionService”接口时,我有“TypeNotRegisteredException”。下面我将展示如何使用它。我需要在应用程序主窗口中可视化“CalibrationView”视图。为此,我在应用程序的主窗口中创建了一个按钮“btnShowCalibrationView”,请参见下面的XAML:

<catel:Window x:Class="FlowmeterConfigurator.Views.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:catel="http://catel.codeplex.com"
          ResizeMode="CanResize">

    <catel:StackGrid x:Name="LayoutRoot">
        <catel:StackGrid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </catel:StackGrid.RowDefinitions>

        <ToolBar>
            <Button Name="btnShowCalibrationView" Content="Flowmeter Calibration" Command="{Binding ShowCalibrationView}"/>
        </ToolBar>
    </catel:StackGrid>

</catel:Window>

从上面的XAML中可以看到,此按钮绑定到“ShowCalibrationView”命令。此命令位于MainWindowViewModel中

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
        // Create 'ShowCalibrationView' command.
        ShowCalibrationView = new Command(ShowCalibrationViewExecute, ShowCalibrationViewCanExecute);
    }

    // Declare 'ShowCalibrationView' command. 
    public Command ShowCalibrationView { get; private set; }

    // The command is always allowed to executing.
    private bool ShowCalibrationViewCanExecute()
    {
        return true;
    }

    // Here is the command logic for visualizing CalibrationView in MainWindow.
    private void ShowCalibrationViewExecute()
    {
        var viewModel = new CalibrationViewModel();
        var dependencyResolver = this.GetDependencyResolver();
        var uiCompositionService = dependencyResolver.Resolve<IUICompositionService>(); // The error is here!
        uiCompositionService.Activate(viewModel, "MainRegion");
    }
    . . . . . .
}
公共类MainWindowViewModel:ViewModelBase { 公共主窗口视图模型() { //创建“ShowCalibrationView”命令。 ShowCalibrationView=新命令(ShowCalibrationViewExecute、ShowCalibrationViewCanExecute); } //声明“ShowCalibrationView”命令。 公共命令ShowCalibrationView{get;private set;} //始终允许执行该命令。 私有布尔显示校准ViewCanExecute() { 返回true; } //以下是在主窗口中可视化CalibrationView的命令逻辑。 私有void ShowCalibrationViewExecute() { var viewModel=新校准viewModel(); var dependencyrolver=this.getdependencyrolver(); var uiCompositionService=dependencyResolver.Resolve();//错误在这里! uiCompositionService.Activate(viewModel,“MainRegion”); } . . . . . . } CalibrationViewModel与应用程序中的MainWindowViewModel位于相同的“ViewModels”文件夹中,“CalibrationView”与应用程序中的MainWindow位于相同的“Views”文件夹中(MainWindow为catel:Window,CalibrationView为catel:UserControl)。当我尝试执行ShowCalibrationView命令时,代码行中

var uiCompositionService = dependencyResolver.Resolve<IUICompositionService>();
var uiCompositionService=dependencysolver.Resolve();
发生以下错误: 指定的类型“Catel.Services.IUICompositionService”未注册或无法构造。使用前请先注册类型。未注册类型“Catel.Services.IUICompositionService”。由于此错误,我的应用程序开发延迟。我做错了什么?请帮我消除这个错误

p.S.我还尝试在我的应用程序中添加引导程序类,并在其中定义以下代码,如所示:

public class Bootstrapper:BootstrapperBase<MainWindow>
{
    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        if (ServiceLocator.Instance.IsExternalContainerSupported(this.Container))
        {
            ServiceLocator.Instance.RegisterExternalContainer(this.Container);
        }
    }
}
公共类引导程序:引导程序数据库
{
受保护的覆盖无效配置容器()
{
base.ConfigureContainer();
if(ServiceLocator.Instance.IsExternalContainerSupported(this.Container))
{
ServiceLocator.Instance.RegisterExternalContainer(this.Container);
}
}
}

但是ConfigureContainer方法有以下错误:“服务定位器”不包含“实例”的定义。

Catel在加载程序集后自动注册类型。但要在.NET中加载程序集,您需要在代码中引用至少1种(非接口)类型,如下所示:

var name = typeof(UICompositionService).FullName;

另一种方法是使用,它会自动为您执行此操作。

谢谢。但如果我使用使用约定的自动请求类型,那么我应该在应用程序中的何处编写下一个代码:“var serviceLocator=newservicelocator();serviceLocator.RegisterTypesUsingDefaultNamingConvention();'?