WPF c#自定义面板

本文关键字:自定义 WPF | 更新日期: 2023-09-27 17:50:37

我想创建一个用户控件,它将以与经典面板(或画布)控件相同的方式工作,期望我想有一些默认的按钮,用户将无法删除。

我试过了:

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

它工作,但当我编译它并在设计器中创建一个CustomPanel实例,然后尝试插入另一个项目时,在构造函数中创建的按钮被删除。

这是正确的方法,还是有一个更好的(更有效/优雅)的方式来修改构造函数?

提前感谢您的努力

WPF c#自定义面板

您的问题是您在构造函数中将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对象之后,再添加按钮。