【问题标题】:WPF C# custom panelWPF C# 自定义面板
【发布时间】:2013-01-03 12:37:52
【问题描述】:

我想创建一个用户控件,它的工作方式与经典 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 实例然后尝试插入另一个项目时,在构造函数中创建的 Button 被删除。

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

在此先感谢您的努力。

【问题讨论】:

  • 你确定在ctor中创建的按钮被删除了吗?还是新孩子只是躺在旧孩子身上?还请在添加第二项的位置发布代码。
  • 是的,它已被删除。我没有在代码中添加第二项,而是在设计器中添加了它,所以在添加第二项后,它看起来像这样:
  • 我尝试了两种方法(在代码和设计器中添加按钮),在这两种情况下,新按钮都没有删除任何内容,它只是覆盖了旧按钮。
  • 如果您自己解决了您的问题,请将正确的解决方案发布并标记为答案,以便有相同问题的人从中受益。

标签: c# wpf xaml user-controls


【解决方案1】:

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

【讨论】:

  • 我试图复制粘贴代码,但不幸的是它对我不起作用 - 我的意思是当我编译它并将 CustomPanel 用户控件添加到窗口然后将另一个按钮添加到 CustomPanel 第一个一个仍然被删除。
  • 我都试过了。无论如何,我刚刚想出了如何解决这个问题。感谢您的帮助。
猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多