2010-09-28 37 views
1

我目前使用实现菜单ContextMenusSilverlight 3中图书馆和。该库在System.Windows.Controls命名空间中定义了MenuItem类。外部别名XAML

SL3没有问题,因为Silverlight类库中的其他位置没有MenuItem类;但现在我需要在Silverlight 4工具包程序集中使用另一个控件,并且该工具包现在在此相同程序集中定义了一个System.Windows.Controls.MenuItem

所以我需要一种方法向编译器表明我想从我的旧程序集中使用System.Windows.Controls.MenuItem,而不是在工具包4程序集中使用System.Windows.Controls.MenuItem。

该解决方案似乎是“外部别名”的功能。

我可以调整我自己用外部别名编写的文件,但是如何向代码生成器指示从XAML生成“.g.i.cs”文件的组件,更确切地说使用哪个别名?

默认情况下,它总是产生在“.g.i.cs”文件System.Windows.Controls.MenuItem变量,当然不别名C#编译器是无法知道使用哪个组件。

我正在使用VS 2010 Professional,但我一直未能找到改变此行为的选项。

在此先感谢。

+0

+1有趣的问题。 – AnthonyWJones 2010-09-28 19:08:15

+0

这就是为什么我考虑向系统添加任何内容。*命名空间是一种不好的做法。 – Yogesh 2010-09-28 19:26:06

+0

@Yogesh是和否:当您为缺少的部分提供实现时,比如Silverlight由于其相对较差的库而常常是这种情况,所以尝试使它看起来像它的WPF对应部分,即参考实现。这样,当组件最终被添加到Silverlight时,您不必更改您的代码。如果工具包提供了所有的菜单实现,而不仅仅是ContextMenus,应该是这种情况。 – Pragmateek 2010-09-28 22:13:03

回答

0

最后我找到了一个解决方法: 我创建了一个包装菜单库中类型的库项目。

例如:

namespace Alias 
{ 
    public class MenuItem : System.Windows.Controls.MenuItem 
    { 
    } 
} 

我然后引用从我真正的项目这个项目,并可以通过他们的“新”的命名空间“别名”使用类型。

这是一种“重要的别名”,但似乎工作。

0

恐怕唯一的解决方法是翻译.gics文件的内容并将其移动到.cs文件中,使用别名调整它,删除partial关键字,然后从中删除x:Class XAML。

上行是设计师仍然会工作。缺点是您需要自己创建任何新的控制字段,并将FindName代码添加到您现在在.cs中的InitializeComponent副本中。就我个人而言,我非常喜欢这个,有足够的理由给元素一个名字,而不是需要成为类中的一个字段(绑定和动画是其中的两个)。它烦人的领域是自动创建和宝贵的加载时间致力于发现和分配时,他们从来没有使用过。