3

我正在使用 WPF,并且正在尝试使一个类继承自UserControl该类并将其用作其他类的基类。我已经阅读了很多关于如何做到这一点的文章(比如这篇有超过 50 次投票的文章),但他们都说了同样的话,但都没有奏效。

我有这个代码:

namespace MyNamespace {
    // handwritten
    public class BaseControl : UserControl { }

    // generated by the IDE
    public partial class XAMLControl1 : UserControl {
        ...
    }
}

现在,我将该行更改为

public partial class XAMLControl1 : BaseControl {

在 XAML 中,我将其从

<UserControl x:Class="MyNamespace.XAMLControl1" ...>
    ...
</UserControl>

<my:BaseControl x:Class="MyNamespace.XAMLControl1"
                xmlns:my="clr-namespace:MyNamespace" ...>
    ...
</my:BaseControl>

my:BaseControl部分以波浪形的蓝色下划线,所以当我将它悬停时,IntelliSense 说

名称“ BaseControl”中不存在名称空间“ clr-namespace:MyNamespace”。

编译器给了我奇怪的错误

  1. 未找到元素“<m>”的结束标记。

  2. m找不到类型“ ”。确认您没有丢失程序集引用并且所有引用的程序集都已构建。

  3. 名称“ BaseControl”中不存在名称空间“ clr-namespace:MyNamespace”。

是的,那是“m找不到类型''”。我没有看到我在哪里尝试使用在m任何地方命名的类型。我认为这是一个不相关的编译器错误,但我想我会提到它。而且我绝对确定该类型BaseControl确实存在于命名空间中MyNamespace。在我输入my:.

我能做些什么来解决这个问题?我正在使用 Visual Studio 2012 Express for Windows Desktop (7)。

4

3 回答 3

3

看来您必须使用自己的 BaseControl 使用单独的dll。当您启动您的xaml文件时,您将开始使用my命名空间,并稍后在您的 xaml.xml 中声明它。如果你想在声明之前使用StaticResource也是一样的。但是,当您将 BaseControl 分离到另一个项目以获取新的dll时,它将在使用之前进行编译。

于 2012-10-25T04:31:17.763 回答
2

当我使用相同的编译器消息遇到相同的问题时,我发现了这个问题。也许我在讨论中遗漏了一些东西,但对我来说,解决方案是添加实现的 Dll 规范,例如:

xmlns:my="clr-namespace:MyNamespace;assembly=MyDll"
于 2013-10-05T10:20:23.170 回答
0

不需要单独的 dll,实际上真的很容易

namespace MyNameSpace.UserControls
{
      public class BaseControl : UserControl { //all the good common stuff... } 
}

然后

namespace MyNameSpace.UserControls
{
      public sealed partial class DerivedControl: BaseControl { //your specific stuff... } 
}

然后(对于 DerivedControl)

<local:BaseControl x:Class="MyNameSpace.UserControls.DerivedControl"
                                   xmlns:local="using:MyNameSpace.UserControls"

(注意,这是针对没有匹配 xaml文件的基类)

请参阅如何在 .xaml 文件中指定不同的基类 (Silverlight)?

于 2014-02-18T16:13:23.257 回答