除非存在伪数据模板,否则在WinRT上加载带有自定义控件的松散Xaml将失败

除非存在伪数据模板,否则在WinRT上加载带有自定义控件的松散Xaml将失败,xaml,windows-runtime,Xaml,Windows Runtime,在ReactiveUI中,我在某个点运行此代码: const string template = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:routing='using:ReactiveUI.Routing'>" + "<routing:ViewModelViewHost ViewModel=\"{Binding}\" VerticalCo

在ReactiveUI中,我在某个点运行此代码:

const string template = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:routing='using:ReactiveUI.Routing'>" +
    "<routing:ViewModelViewHost ViewModel=\"{Binding}\" VerticalContentAlignment=\"Stretch\" HorizontalContentAlignment=\"Stretch\" IsTabStop=\"False\" />" +
"</DataTemplate>";

var theTemplate = XamlReader.Load(template);
扭曲 但是,如果在页面上包含虚拟资源:

<Page.Resources>
    <DataTemplate x:Name="Foo">
        <routing:ViewModelViewHost ViewModel="{Binding}" />
    </DataTemplate>
</Page.Resources>

…那就行了!给出了什么?

这个“扭曲”让我认为这一定是因为应用程序没有针对被实例化类型的正确XAML元数据-WinRT使用反射来解析WPF/Silverlight等XAML文件中的类型,而不是使用代码生成来通过
IXAMLMataProvider
接口解析(有一个很好的描述;听起来像你在做什么,另请参见)。添加引用会强制正确生成此元数据代码。如果是这种情况,你应该能够通过简单地将类型本身添加到某个未使用的键下的资源中,而不使用数据模板来实现相同的效果

查看应用程序的“obj”目录下,Visual Studio生成一个
XamlTypeInfo.g.cs
文件来实现
IXamlMetadataProvider
。这应该包含一个失败类型的条目-在添加了伪引用的情况下,应该有实例化该类型所需的完整详细信息。没有这个,我发现可能会有一些错误引用类型类型,但信息不足-但是这会阻止错误通过行为(在可能具有自定义元数据提供程序的依赖DLL中查找该类型)

除了在最后的应用程序本身中添加一个虚拟引用到库类型,我发现的唯一解决方案是将属性应用到类型中。当这应该与C++相关时,我发现这可以用在C++中强制一个类型总是出现在XAML类型元数据生成的代码中。让我认为这一定是因为应用程序没有针对被实例化类型的正确XAML元数据-WinRT没有使用反射来解析WPF/Silverlight等XAML文件中的类型,而是使用代码生成通过

IXamlMetadataProvider
接口来解析(有一个很好的描述;听起来像你在做什么,另请参见)。添加引用会强制正确生成此元数据代码。如果是这种情况,你应该能够通过简单地将类型本身添加到某个未使用的键下的资源中,而不使用数据模板来实现相同的效果

查看应用程序的“obj”目录下,Visual Studio生成一个
XamlTypeInfo.g.cs
文件来实现
IXamlMetadataProvider
。这应该包含一个失败类型的条目-在添加了伪引用的情况下,应该有实例化该类型所需的完整详细信息。没有这个,我发现可能会有一些错误引用类型类型,但信息不足-但是这会阻止错误通过行为(在可能具有自定义元数据提供程序的依赖DLL中查找该类型)

除了在最后的应用程序本身中添加一个虚拟引用到库类型,我发现的唯一解决方案是将属性应用到类型。虽然这应该与C++相关,但我发现这可以用C语言来强制一个类型总是出现在XAML类型元数据生成的代码中。

<Page.Resources>
    <DataTemplate x:Name="Foo">
        <routing:ViewModelViewHost ViewModel="{Binding}" />
    </DataTemplate>
</Page.Resources>