我正在使用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
”。
编译器给了我奇怪的错误
关闭元素'&lt; m&gt;'的标记没找到。
找不到类型“
m
”。验证您是否缺少程序集引用,并且已构建所有引用的程序集。- 醇>
名称空间“
BaseControl
”中不存在名称“clr-namespace:MyNamespace
”。
是的,那是“找不到类型'm
”。我没有看到我在哪里尝试使用名为m
的类型。我认为这是一个无关的编译器错误,但我想我会提到它。而且我也确定BaseControl
类型确实存在于命名空间MyNamespace
中。输入my:
后,Intellisense没有提出任何建议。
我该怎么做才能解决这个问题?我正在使用Visual Studio 2012 Express for Windows Desktop(7)。
答案 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)?