使用从UserControl派生的类作为基础的XAML错误

时间:2012-10-25 04:19:41

标签: c# wpf xaml

我正在使用WPF,我正在尝试从UserControl继承一个类,并将该类用作其他类的基类。我已经阅读了很多关于如何做到这一点的文章(例如this one有超过50个upvotes),但是他们都说同样的事情而且都没有。

我有这段代码:

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. 关闭元素'&lt; m&gt;'的标记没找到。

  2.   
  3. 找不到类型“m”。验证您是否缺少程序集引用,并且已构建所有引用的程序集。

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

  6.   

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

xmlns:my="clr-namespace:MyNamespace;assembly=MyDll"

答案 2 :(得分: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 文件)

请参阅How do you specify a different base class in .xaml files (Silverlight)?