加载松散XAML与WinRT的自定义控件失败,除非虚拟DataTemplate中存在(Loading

2019-08-17 04:45发布

在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);

在其它平台上,这个伟大工程(中xmlns声明当然是不同的),但{的WinRT /地铁/ Windows应用商店},这将引发一个未指定的错误:

WinRT information: The type 'ViewModelViewHost' was not found. [Line: 1 Position: 253]

扭曲

但是,如果包括在页面上的虚拟资源:

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

...那么它的作品! 是什么赋予了?

Answer 1:

在“扭曲”让我想这一定是因为应用程序没有对类型正确的XAML元数据被实例化的-而不是使用反射来解决XAML文件如WPF / Silverlight的类型,WinRT中使用的代码生成通过解决IXamlMetadataProvider接口(有一个像样的介绍在这里 , 这听起来像是你在做什么,也看到了随访 )。 添加参考势力该元数据的代码正确生成。 如果是这样的话,你应该能够通过简单地将类型本身的资源下,一些未使用的关键,而数据模板来达到同样的效果。

在应用程序中的“目标文件”目录一看,Visual Studio中生成一个XamlTypeInfo.g.cs文件来实现IXamlMetadataProvider 。 这应该包含发生故障的类型的条目 - 在您添加了一个虚设的参考的情况下,应该有实例类型所需要的全部细节。 没有这一点,我发现它可能有一定的参考输入类型,但是由于信息缺乏 - 然而,这可以防止下通行为(查找其中可能有一个自定义的元数据提供一个相关的DLL类型)。

除了增加一个虚拟参考最终的应用程序本身的库类型,我发现这样做的唯一解决方案是将应用Bindable属性的类型。 虽然这被认为涉及到C ++,我发现这可以在C#被用于强制类型总是出现在XAML类型的元数据生成的代码。



文章来源: Loading Loose Xaml with custom controls on WinRT fails unless dummy DataTemplate exists