C# ... 隐藏继承的成员。。。使用新关键字
我收到一个奇怪的警告,我不明白 我有两个C# ... 隐藏继承的成员。。。使用新关键字,c#,user-controls,windows-runtime,C#,User Controls,Windows Runtime,我收到一个奇怪的警告,我不明白 我有两个用户控件。第一个BaseControl从按钮继承,第二个SecondControl从BaseControl继承。 我没有更改任何内容,因此两个用户控件都像VS2012一样创建它们(默认构造函数等)。我只是删除了BaseControl的sealed关键字以继承它 现在,如果我构建该项目,将发出以下警告: 'MyProject.Controls.SecondControl.Connect(int, object)' hides inherited member
用户控件
。第一个BaseControl
从按钮继承,第二个SecondControl
从BaseControl
继承。
我没有更改任何内容,因此两个用户控件都像VS2012一样创建它们(默认构造函数等)。我只是删除了BaseControl
的sealed
关键字以继承它
现在,如果我构建该项目,将发出以下警告:
'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上找到了一些关于此错误的文章,但这些都没有帮助我:(
编辑:添加上面提到的所有类
基本控制:
namespace MyProject.Controls
{
public partial class BaseControl : Button
{
public BaseControl()
{
this.InitializeComponent();
}
}
}
第二控制:
namespace MyProject.Controls
{
public sealed partial class SecondControl: BaseControl
{
public SecondControl()
{
this.InitializeComponent();
}
}
}
我检查了Windows.UI.Xaml.Controls.Button的整个继承链,没有连接(int,object)或任何其他连接()。我没有添加任何连接()-方法。您不能从UserControl
创建控件,并使其成为按钮和派生控件。BaseControl需要是密封的UserControl。您可以使UserControl像按钮一样工作和/或包含按钮
关于为什么事情会出问题的部分线索来自于这些文件
它试图使用添加到为UserControl
s生成的类中的Connect方法连接UI。但是,通过为同一XAML(或不同的XAML)定义多个类,它为每个类生成Connect方法(在您的示例中为BaseControl和SecondControl)。这就是为什么它从一开始就被密封起来的原因:为了防止这种情况发生。你不能可靠地让一个类使用XAML中的UI,然后轻松地创建派生类。正如你所看到的,构建和VS变得一团糟(WinForms、WPF、ASP.NET WebForms和Silverlight多年来一直存在这个问题)
您可能想做的是创建一个模板控件。这使您能够在XAML中定义UI(并在子类中修改它)。这就是按钮最初在WinRT(及其祖先Silverlight和WPF)中创建的方式
您将在ResourceDictionary中创建一个样式:
<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>
您不能从UserControl
创建控件,并使其成为按钮
和派生控件。BaseControl需要是密封的UserControl。您可以使UserControl像按钮一样工作和/或包含按钮
关于为什么事情会出问题的部分线索来自于这些文件
它试图使用添加到为UserControl
s生成的类中的Connect方法连接UI。但是,通过为同一XAML(或不同的XAML)定义多个类,它为每个类生成Connect方法(在您的示例中为BaseControl和SecondControl)。这就是为什么它从一开始就被密封起来的原因:为了防止这种情况发生。你不能可靠地让一个类使用XAML中的UI,然后轻松地创建派生类。正如你所看到的,构建和VS变得一团糟(WinForms、WPF、ASP.NET WebForms和Silverlight多年来一直存在这个问题)
您可能想做的是创建一个模板控件。这使您能够在XAML中定义UI(并在子类中修改它)。这就是按钮最初在WinRT(及其祖先Silverlight和WPF)中创建的方式
您将在ResourceDictionary中创建一个样式:
<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>