1

ユーザーが削除できないデフォルトのボタンがいくつかあることを期待して、従来の Panel (または Canvas) コントロールと同じように機能するユーザー コントロールを作成したいと考えています。

私はこれを試しました:

namespace WpfApplication1
{
    public class CustomPanel : Canvas
    {
        public CustomPanel()
        {
            Button b = new Button();
            b.Name = "Button1";
            b.Content = "Button1";
            this.Children.Add(b);
        }
    }
}

動作しますが、コンパイルしてデザイナーで CustomPanel のインスタンスを作成し、別の項目を挿入しようとすると、コンストラクターで作成されたボタンが削除されます。

これはまったく正しいアプローチですか、それともコンストラクターを変更するよりも優れた (より効果的/エレガントな) 方法がありますか?

よろしくお願いいたします。

4

1 に答える 1

2

問題は、コンストラクターで Button をChildrenオブジェクトに追加し、XAML でインスタンス化するときにChildrenオブジェクト全体を置き換えることです。あなたの XAML は次のようになっていると思います:?

<wpfApplication3:CustomPanel>
   <Button Content="New b"/>
</wpfApplication3:CustomPanel>

代わりにこのように開始すると、ボタンが所定の位置にとどまることがわかります。

public MainWindow()
{
    InitializeComponent();
    Loaded += OnLoaded;
}

private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
    CustomPanel p = new CustomPanel();
    p.Children.Add(new Button(){Content = "T"});
    gr.Children.Add(p);
}

これを回避するためにできることは次のとおりです。

public CustomPanel()
{
    Initialized += OnInitialized;
}

private void OnInitialized(object sender, EventArgs eventArgs)
{
    var b = new Button { Name = "Button1", Content = "Button1" };
    Children.Insert(0,b);
}

ボタンを追加する前に、XAML が Children オブジェクトを置き換えるまで待ちます。

于 2013-01-03T12:57:22.583 に答える