【问题标题】:Add WPF control at runtime在运行时添加 WPF 控件
【发布时间】:2008-11-22 09:24:08
【问题描述】:

我编写了一个 WPF 用户控件,并希望在运行时单击一个按钮时将其中的一个或多个添加到我的窗口中。我该怎么做?

编辑:进一步说明 我想将用户控件添加到画布,并放在绝对位置。画布是我房子里的地板图,每个用户控件都有属性来指示它在房子里的位置。所以我希望所有控件都位于画布上的正确位置。

我在想这样的事情

var light = new LightUserControl(2);
HouseCanvas.Children.Add(light); // this should be positioned in a specific place

【问题讨论】:

    标签: wpf


    【解决方案1】:

    将控件添加到 Canvas 后,您需要使用 Canvas.Top 和 Canvas.Left 附加属性指定顶部和左侧坐标,如下所示。

    var light = new LightUserControl(2);
    HouseCanvas.Children.Add(light);
    Canvas.SetLeft(light, 20);
    Canvas.SetTop(light, 20);
    

    【讨论】:

    • 在使用 WPF 数小时后,我看不出它比 WinForms 有什么优势。我的意思是真的,他们似乎让简单的事情变得非常困难、复杂,并且在一层又一层的抽象之上实现。这东西让我想打自己的脸。 /咆哮 /巨魔 /无用的评论
    • 完全同意 Ed - WPF 比 WinForms 更漂亮,并且具有有用的皮肤功能,但很难学习(无法发现),将大量错误从编译时推到运行时等,除了漂亮的图形之外,它的巨大复杂性几乎没有显示出来。我可以想出很多方法可以改进它的设计。
    • @EdS。 WPF 令人印象深刻,字面意思是 小时,您已经得出了这个结论。
    • @Erode:是的,我承认;发表这一声明为时过早。我喜欢 WPF 的强大功能。它也使本来应该很简单的任务变得非常困难。我不认为它是一个很棒的 UI 平台,但也不是很糟糕,这是在 WPF 项目工作 8 个月之后。
    • @Erode:“现在”确实,我们将看看 WPF 在 Windows 8 发布后的表现如何……此外,我还记得发表过这样的评论。我相信这是在花费数小时试图让(应该是)一些简单的鼠标事件处理程序工作后感到沮丧。
    【解决方案2】:

    如果您想将控件添加到 Grid 而不是 Canvas,您可以通过 Grid 静态类指定所有 Grid 属性,如下所示:

    Label newLabel = new Label();
    newLabel.Content = "The New Element";
    Main.Children.Add(newLabel);
    Grid.SetColumn(newLabel, 0);
    Grid.SetRow(newLabel, 0);
    

    【讨论】:

    • 这不一定是原始提问者想要的,但它对我有帮助。谢谢。
    • 第二行中的label 必须是newLabel 对吧?
    • @kame 我猜是这样
    【解决方案3】:

    向窗口添加一个 StackPanel 并在每个按钮单击时,

     _stackPanel.Children.Add(new YourControl());  
    

    您可以通过多种方式做到这一点。

    【讨论】:

    • 谢谢,.Children 属性是我需要的
    【解决方案4】:

    我的解决方案:

    for (i = 1; i <= buttoncount; i++)
    {
        Button mybutton = new Button();
        Grid1.Children.Add(mybutton);
        mybutton.Height = 100;
        mybutton.Width = 100;
        mybutton.Name = "button" + i;
        mybutton.Content = mybutton.Name;
    }
    

    【讨论】:

      【解决方案5】:
          public static void AddChild(this Visual parent, UIElement child)
          {
              if (InternalAddChild(parent, child))
              {
                  return;
              }
              throw new NotSupportedException();
          }
          private static bool InternalAddChild(Visual parent, UIElement child)
          {
              Panel panel = parent as Panel;
              if (panel != null)
              {
                  panel.Children.Add(child);
                  return true;
              }
              for (int i = VisualTreeHelper.GetChildrenCount(parent) - 1; i != -1; i--)
              {
                  Visual target = VisualTreeHelper.GetChild(parent, i) as Visual;
                  if (target != null && InternalAddChild(target, child))
                  {
                      return true;
                  }
              }
              return false;
          }
      

      【讨论】:

        【解决方案6】:

        只是补充答案:

        for (i = 1; i <= buttoncount; i++)
        {
            Button mybutton = new Button();
            Grid1.Children.Add(mybutton);
            mybutton.Height = 100;
            mybutton.Width = 100;
            mybutton.Name = "button" + i;
            mybutton.Content = mybutton.Name;
            mybutton.Click += button_Click;
        }
        
        private void button_Click(object sender, RoutedEventArgs e)
        {
            // do something
        }
        

        【讨论】:

          猜你喜欢
          • 2012-12-21
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多