C# WPF容器的通用类(画布、网格等)

C# WPF容器的通用类(画布、网格等),c#,wpf,containers,C#,Wpf,Containers,我正在创建一个由按钮调用的方法。然后,该方法将画布添加到按钮的父容器控件。例如,按钮位于网格上。然后该方法创建一个画布,该画布显示在按钮的正下方。但我有两个问题: 如何获取对按钮父容器的引用 是否有用于容器控件的类?我不在乎按钮是否在网格、画布、Stackpanel等中,因此我正在寻找所有类型的contianer实现的接口或它们继承的类 第二个方面更重要,因为我可以手动传递对容器的引用 编辑: 它应该是这样的(减去颜色,这些只是为了显示不同的元素 红色画布应该会弹出来处理确认。甚至可以使用

我正在创建一个由按钮调用的方法。然后,该方法将画布添加到按钮的父容器控件。例如,按钮位于网格上。然后该方法创建一个画布,该画布显示在按钮的正下方。但我有两个问题:

  • 如何获取对按钮父容器的引用
  • 是否有用于容器控件的类?我不在乎按钮是否在网格、画布、Stackpanel等中,因此我正在寻找所有类型的contianer实现的接口或它们继承的类
第二个方面更重要,因为我可以手动传递对容器的引用

编辑:

它应该是这样的(减去颜色,这些只是为了显示不同的元素

红色画布应该会弹出来处理确认。甚至可以使用一个漂亮的动画。我的想法是创建一个可以调用的类,类似于:

MyPopup popup = new MyPopup("Are you sure?", "Yes", "No", delegateFirstButton, delegateSecondButton);
popup.Show();
到目前为止,我的代码还不是一个类,而只是一个方法。文本部分目前是硬编码的。标记行需要更灵活,这就是我提出问题的原因

public void ShowPopup(Control senderControl)
{
    //I need to have a parameter that accepts all containers instead of this line:
    this.myGrid.Children.Add(popup);

    Border border = new Border();
    popup.Children.Add(border);
    border.Margin = new Thickness() { Top = 10 };
    border.Child= text;
    text.Text = "Are you sure?";
    text.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
    popup.SizeChanged += delegate { border.Width = popup.ActualWidth; };

    popup.Children.Add(btn1);
    btn1.Content = "Yes";
    btn1.Height = 22;
    btn1.Padding = new Thickness(10, 0, 10, 0);
    btn1.Margin = new Thickness() { Left = 15, Top = 35 };

    popup.Children.Add(btn2);
    btn2.Content = "No";
    btn2.Height = 22;
    btn2.Padding = new Thickness(10, 0, 10, 0);
    btn1.SizeChanged += delegate { btn2.Margin = new Thickness() { Left = 30 + btn1.ActualWidth, Top = 35 }; };

    popup.Height = 70;
    btn2.SizeChanged += delegate
    {
        popup.Width = 45 + btn1.ActualWidth + btn2.ActualWidth;
        updatePositions(senderControl);
    };

    popup.Background = Brushes.Red;

    popup.VerticalAlignment = System.Windows.VerticalAlignment.Top;
    popup.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
}

public void updatePositions(Control senderControl)
{
    Point location = senderControl.TranslatePoint(new Point(0, 0), this.myGrid);

    popup.Margin = new Thickness()
    {
        Left = location.X + (senderControl.ActualWidth / 2) - (popup.Width / 2),
        Top = location.Y + senderControl.ActualHeight + 15
    };
}

听起来你选择了一条艰难的道路

如果需要弹出窗口,请使用

否则,无论出于何种原因,如果不想使用它,最好在XAML根附近放置一个网格,并始终将其用作容器:

<Window>
   <Grid x:Name="MainUI"/>
   <Grid x:Name="PopupContainer"/>
</Window>

否则,您几乎总是会遇到
Z-Index
问题(如果您遵循当前的方法)

另外,在代码中创建所有UI内容是一个非常糟糕的主意。要么将“是/否”对话框封装在
UserControl
中,要么为此创建一个合适的
模板


正如我之前所说的,避免不惜一切代价在代码中创建/操作UI元素,因为这会产生很多可维护性问题。

什么?不要在WPF中操作代码中的UI元素。你为什么要这样做?我看不出为什么
会在按钮的父容器控件中添加画布。
…请解释你需要什么,然后我们就可以了可以为您提供正确的方法。是的,这正是我想要做的。我在画布上用代码创建一些元素,并需要将它们附加到现有容器。我必须多次显示此画布,并用一行代码调用它。因此,我想将其封装在它自己的方法或类中。
我必须显示此画布多次
…这可能是
数据模板
控制模板
…不要在代码中操作UI元素。WPF不是winforms。谢谢你的指针。但这并不能真正帮助我…你为什么不使用
弹出式
类呢?而不是尝试推出你自己的