Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF C#定制面板_C#_Wpf_Xaml_User Controls - Fatal编程技术网

WPF C#定制面板

WPF C#定制面板,c#,wpf,xaml,user-controls,C#,Wpf,Xaml,User Controls,我想创建一个用户控件,它的工作方式与经典的面板(或画布)控件相同,我希望有一些用户无法删除的默认按钮 我试过这个: namespace WpfApplication1 { public class CustomPanel : Canvas { public CustomPanel() { Button b = new Button(); b.Name = "Button1";

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

我试过这个:

namespace WpfApplication1
{
    public class CustomPanel : Canvas
    {
        public CustomPanel()
        {
            Button b = new Button();
            b.Name = "Button1";
            b.Content = "Button1";
            this.Children.Add(b);
        }
    }
}
它可以工作,但当我编译它并在设计器中创建CustomPanel的实例,然后尝试插入另一项时,在构造函数中创建的按钮会被删除

这到底是正确的方法还是有更好(更有效/更优雅)的方法来修改构造函数


提前感谢您的努力。

您的问题是将按钮添加到构造函数中的子对象中,然后在XAML中对其进行实例时替换整个子对象。 我猜你的XAML是这样的:

<wpfApplication3:CustomPanel>
   <Button Content="New b"/>
</wpfApplication3:CustomPanel>
要避免这种情况,您可以采取以下措施:

public CustomPanel()
{
    Initialized += OnInitialized;
}

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

现在,在添加按钮之前,请等待XAML替换了子对象。

是否确实删除了在ctor中创建的按钮?还是新来的孩子就躺在老孩子的身上?请在添加第二个项目的地方张贴代码。是的,它已被删除。我没有在代码中添加第二项,而是在设计器中添加第二项,因此在添加第二项后,它看起来是这样的:我尝试了两种方法(在代码和设计器中添加按钮),在这两种情况下,新按钮都没有删除任何内容,只是覆盖了旧按钮。如果您自己解决了问题,请张贴正确的答案并将其标记为答案,因此,有相同问题的人可以从中受益。我尝试复制粘贴代码,但不幸的是,它对我不起作用-我的意思是,当我编译代码并将CustomPanel用户控件添加到窗口,然后将另一个按钮添加到CustomPanel时,第一个按钮仍然被删除。我尝试了这两种方法。不管怎样,我刚刚想出了解决问题的办法。谢谢你的帮助。
public CustomPanel()
{
    Initialized += OnInitialized;
}

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