...隐藏继承的成员...使用新关键字

时间:2012-11-11 19:04:21

标签: c# user-controls windows-runtime

我得到一个奇怪的警告,我不明白。

我有两个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()方法。

1 个答案:

答案 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);
    }
}
相关问题