WPF如何从自定义UserControl代码访问同级

本文关键字:代码 访问 UserControl 自定义 WPF | 更新日期: 2023-09-27 18:28:28

如果存在包含两个其他控件的WPF WindowUserControl0

UserControl1-自定义用户控件,带有单独的xaml和后面的代码

UserControl2-自定义用户控件,带有单独的xaml和后面的代码

如何从UserControl2代码后面访问/引用UserControl1?我知道我可以通过使用this.Parent(继承自FrameworkElement.Parent)从代码后面获得父窗口,也可以通过Window.GetWindow(this)获得父窗口。但是引用这个同级控件呢?

WPF如何从自定义UserControl代码访问同级

我认为这是一种糟糕的做法,仍然很容易实现。将Usercontrol2类型的属性添加到UserControl1,将UserControl1类型的属性增加到Usercontrol2。在Window或UserControl0构造函数中设置以下属性:

UserControl1.UserControl2 = UserControl2;
UserControl2.UserControl1 = UserControl1;

确保UserControls在Window.xaml中有名称(此处的名称UserControl1和UserControl2只是示例)

给每个控件一个名称,更确切地说是x:Name

示例:

<UserControl0 x:Name="control0">
  <StackPanel>
    <UserControl1 x:Name="control1"/>
    <UserControl2 x:Name="control2"/>
  </StackPanel>
</UserControl0>

从UserControl0.cs中的代码隐藏,您可以访问control1control2

在这种情况下,如果希望UserControl2访问UserControl1,可以在定义UserControl0的窗口中创建一个实例变量。

public static MainWindow Instance;
public MainWindow () {
    Instance = this;

访问类似:

App.MainWindow.Instance.control1

在UserControl1的代码背后使用此代码:

    public static T FindParent<T>(DependencyObject child) where T : DependencyObject
    {
        //get parent item
        DependencyObject parentObject = VisualTreeHelper.GetParent(child);
        //we've reached the end of the tree
        if (parentObject == null) return null;
        //check if the parent matches the type we're looking for
        T parent = parentObject as T;
        if (parent != null)
            return parent;
        else
            return FindParent<T>(parentObject);
    }
    public void Show()
    {
        StackPanel container = FindParent<StackPanel>(this);
        UserControl user_control2 = container.Children[1] as UserControl;
    }