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>