3

在我的 WP7 解决方案中,我有一个PhoneClassLibrary1程序集。在它的 AssemblyInfo.cs 我有

[assembly: XmlnsPrefix("FooNamespace", "cl")]
[assembly: XmlnsDefinition("FooNamespace", "PhoneClassLibrary1")]

我有一个微不足道的控制PhoneClassLibrary1

using System.Windows.Controls;

namespace PhoneClassLibrary1
{
    public class Class1 : Control {}
}

PhoneApp1同一解决方案中的项目具有主页

<phone:PhoneApplicationPage 
    x:Class="PhoneApp1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:cl="FooNamespace">

    <cl:Class1/>

</phone:PhoneApplicationPage>

这编译得很好。但是当运行时,我得到XamlParseException

{“找不到类型‘Class1’,因为‘FooNamespace’是一个未知的命名空间。[行:8 位置:6]”}

我尝试将名称分配给控件<cl:Class1 x:Name="foo"/>以在生成的代码中引用 Class1。一样XamlParseException

我在PhoneApp1. 请注意那个AssemblyPart标签。

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Deployment.Parts>
    <AssemblyPart x:Name="PhoneClassLibrary1" Source="PhoneClassLibrary1.dll" />
  </Deployment.Parts>
</Deployment>

该应用程序成功启动后。


如果我检查 PhoneApp1.xap (这是一个部署包),我可以看到以下生成的 AppManifest.xml

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="PhoneApp1" EntryPointType="PhoneApp1.App" RuntimeVersion="4.7.50308.0">
  <Deployment.Parts>
    <AssemblyPart x:Name="PhoneApp1" Source="PhoneApp1.dll" />
    <AssemblyPart x:Name="PhoneClassLibrary1" Source="PhoneClassLibrary1.dll" />
    <AssemblyPart x:Name="PhoneClassLibrary1" Source="PhoneClassLibrary1.dll" />
  </Deployment.Parts>
</Deployment>

那不是错字。只有在生成的 AppManifest.xml<AssemblyPart x:Name="PhoneClassLibrary1"中指定TWICE时,应用程序才能运行


难道我做错了什么?我从事一个控制项目,该项目在多个解决方案中重复使用,并且不想在所有这些众多项目中修改 AppManifset.xml。

XmlnsDefinition无需修改 AppManifset.xml 就可以工作吗?

4

1 回答 1

0

我对 XmlnsPrefixAttribute 的假设是,这为工具提供了优先使用的提示,并且是可选的。XAML 中的有效 xmlns 定义是:- xmlns:cl="clr-namespace:FooNamespace;Assembly=PhoneClassLibrary1"

clr-namespace 前缀用于生成包含命名空间和包含所需类型的程序集的有效 Uri。

于 2013-04-11T22:10:26.713 回答