0

わからないという奇妙な警告が出ました。

私は2つ持っていUserControlsます。最初のものBaseControlはから継承しButton、2番目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()メソッドも追加しませんでした。

4

1 に答える 1

3

UserControlからコントロールを作成して、それをButtonANDにして派生コントロールにすることはできません。BaseControlは、封印されたUserControlである必要があります。UserControlをボタンのように動作させたり、ボタンを含めたりすることができます。

IComponentContainerのドキュメントは、問題が発生している理由の一部です。

生成されたsのクラスに追加されたConnectメソッドを使用してUIを接続しようとしていますUserControl。ただし、同じXAML(または異なるXAML)に対して複数のクラスを定義することにより、クラスごとにConnectメソッド(この例ではBaseControlとSecondControl)が生成されます。それが最初に封印された理由です:これが起こらないようにするためです。1つのクラスでXAMLのUIを確実に使用して、派生クラスを簡単に作成することはできません。ご覧のとおり、ビルドとVSが混乱しています(WinForms、WPF、ASP.NET WebForms、Silverlightでは長年この問題が発生しています)。

代わりに、テンプレートコントロールを作成することをお勧めします。これにより、UIをXAMLで定義する(およびサブクラスで変更する可能性がある)ことができます。このようにして、ボタンは元々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 に答える