C# ';TypeNotRegisteredException';在尝试使用';IUICompositionService';接口
在我的WPF MVVM Catel应用程序中使用“IUICompositionService”接口时,我有“TypeNotRegisteredException”。下面我将展示如何使用它。我需要在应用程序主窗口中可视化“CalibrationView”视图。为此,我在应用程序的主窗口中创建了一个按钮“btnShowCalibrationView”,请参见下面的XAML: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
<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();'?