0

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

我有两个UserControls。第一个BaseControl继承自Button,第二个SecondControl继承自BaseControl。我没有改变任何东西,所以两个 UserControls 就像 VS2012 创建它们(默认构造函数等)我只删除了sealed关键字 ofBaseControl为了继承它。

现在,如果我构建项目,则会发出以下警告:

'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 的整个继承链,没有 Connect(int, object) 或任何其他 Connect()。我也没有添加任何 Connect() 方法。

4

1 回答 1

3

您不能从 a 创建控件UserControl并使其成为ButtonAND 派生控件。BaseControl 必须是密封的 UserControl。您可以使 UserControl 像一个按钮一样工作和/或包含一个按钮。

IComponentContainer的文档部分是关于为什么会出错的线索。

它正在尝试使用为 s 添加到生成的类的 Connect 方法连接 UI UserControl。但是,通过为相同的 XAML(或不同的 XAML)定义多个类,它会为每个类(在您的示例中为 BaseControl 和 SecondControl)生成 Connect 方法。这就是为什么它一开始就被密封:防止这种情况发生。您不能可靠地让一个类使用 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>

还有一个使用该样式的类:

public sealed class CustomControl1 : Control
{
    public CustomControl1()
    {
        this.DefaultStyleKey = typeof(CustomControl1);
    }
}
于 2012-11-11T20:31:20.763 回答