x:在WPF和Silverlight之间使用XAML的名称问题

时间:2011-04-05 14:52:57

标签: wpf silverlight xaml namespaces

我的用户控件XAML文件中存在奇怪的命名空间解析问题。

如果我创建一个新的WPF库,它会添加以下内容:

<UserControl x:Class="UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</UserControl>

这将评估为MyLibraryNameSpace.UserControl1的类名。

但是,如果我添加一个Silverlight类库并将UserControl添加到该应用程序,我将获得以下XAML

<UserControl x:Class="MyLibraryNameSpace.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</UserControl>

这评估同样的事情,但是XAML是不同的,所以我不能让Silverlight和WPF项目引用相同的XAML,因为x:Class语句对于一个是正确的而对另一个是不正确的。如果我在WPF中指定x:Class =“MyLibraryNameSpace.UserControl1”,它将被解释为我当前项目下的MyLibraryNameSpace.MyLibraryNameSpace.UserControl1。

如何让我的WPF库使用完全限定的类名或以其他方式解决此方案,以便我可以使用单个命名空间来共享WPF / Silverlight代码?

2 个答案:

答案 0 :(得分:0)

我越想到这一点,我就越认为这只是一个设计决策,他们在WPF和Silverlight团队之间做出了不同的决定,并且因为害怕破坏向后兼容性而没有调整内容。

我最后要做的是创建两个子文件夹:一个用于WPF,另一个用于Silverlight。 .xaml.cs文件保存在controls文件夹中,但XAML已复制到Silverlight和WPF文件夹并稍作修改。这样,至少背后的代码是共享的。接下来,我将使用控件而不是用户控件,并在可能的时候将现有用户控件转换为控件( 让我共享XAML)。

故事的道德:使用WPF / Silverlight多目标控件,而不是用户控件。

答案 1 :(得分:0)

在WPF和Silverlight之间共享一个UserControl是完全可能的(不管是一个好主意我会留给别人,对我而言,这取决于你能分享多少)。共享XAML肯定比共享代码更难,因为你无法依靠能够解决不兼容问题。我希望您的Silverlight XAML能够按原样在WPF中工作。

我通常采用的方法是

  • 分离Silverlight和WPF解决方案,每个解决方案中都有相应的项目(具有相同的名称/命名空间)
  • 在Silverlight项目中创建UserControl
  • 将UserControl作为链接添加到WPF项目

我真的没看到x:Name与你的问题有关,WPF和Silverlight都有这个。