我得到一个奇怪的警告,我不明白。
我有两个UserControls
。第一个BaseControl
继承自Button
,第二个SecondControl
继承自BaseControl
。
我没有更改任何内容,因此两个UserControl都像VS2012创建它们(默认构造函数等)。我只删除了sealed
BaseControl
关键字以继承它。
现在,如果我构建项目,则会发出以下警告:
'MyProject.Controls.SecondControl.Connect(int, object)' hides inherited member
'MyProject.Controls.BaseControl.Connect(int, object).' Use the new keyword if hiding was intended.
当我点击此警告时,VS2012会打开一个名为'SecondControl.g.cs'
的文件并显示:
partial class SecondControl: global::MyProject.Controls.BaseControl, global::Windows.UI.Xaml.Markup.IComponentConnector
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void Connect(int connectionId, object target)
{
this._contentLoaded = true;
}
}
这是什么意思?除了Connect()
之外,我没有任何名为SecondControl.g.cs
的方法,但这不是我的方法。
任何暗示如何解决这个问题?即使它只是一个警告,我的应用程序工作正常,我不喜欢在输出窗口中有任何警告/错误:))
我在SO上发现了一些关于这个错误的文章,但这些都没有帮助我:(
编辑:添加上面提到的所有类。
BASECONTROL:
namespace MyProject.Controls
{
public partial class BaseControl : Button
{
public BaseControl()
{
this.InitializeComponent();
}
}
}
SecondControl:
namespace MyProject.Controls
{
public sealed partial class SecondControl: BaseControl
{
public SecondControl()
{
this.InitializeComponent();
}
}
}
我检查了Windows.UI.Xaml.Controls.Button的整个继承链,并且没有Connect(int,object)或任何其他Connect()。我也没有添加任何Connect()方法。
答案 0 :(得分:3)
您无法从UserControl
创建控件并将其设为Button
并且具有派生控件。 BaseControl需要是一个密封的UserControl。您可以使UserControl像按钮一样操作和/或包含按钮。
IComponentContainer的文档部分是为什么事情出错的线索。
它正在尝试使用添加到UserControl
生成的类的Connect方法连接UI。但是,通过为同一个XAML(或不同的XAML)定义多个类,它为每个类生成Connect方法(在您的示例中为BaseControl和SecondControl)。这就是它开始时被密封的原因:防止这种情况发生。您无法在一个类使用的XAML中可靠地拥有UI,然后轻松创建派生类。正如您所看到的,构建和VS搞砸了(多年来,WinForms,WPF,ASP.NET WebForms和Silverlight都出现了这个问题)。
您可能想要做的是创建模板控件。这使您能够在XAML中定义UI(并在潜在的子类中进行修改)。这就是按钮最初是在WinRT(及其祖先Silverlight和WPF)中创建的。
您最终将在ResourceDictionary中创建一个Style:
<Style TargetType="local:CustomControl1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CustomControl1">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用该样式的类:
public sealed class CustomControl1 : Control
{
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
}