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

WPF how to access sibling from custom UserControl code

如果 WPF WindowUserControl0 包含另外两个控件:

UserControl1 - 带有单独 xaml 和代码隐藏

的自定义用户控件

UserControl2 - 带有单独 xaml 和代码隐藏

的自定义用户控件

如何从 UserControl2 代码隐藏访问/引用 UserControl1? 我知道我可以通过使用 this.Parent(继承自 FrameworkElement.Parent)从代码隐藏中获取父级,也可以通过 Window.GetWindow(this) 获取父级 window。但是如何引用这个兄弟控件呢?

为每个控件命名,更准确地说是 x:Name

示例:

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

从 code-behind 到 UserControl0.cs,您可以访问 control1control2

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

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

访问方式:

App.MainWindow.Instance.control1

我认为这是不好的做法,但仍然很容易做到。将 Usercontrol2 类型的 属性 添加到 UserControl1,将 Usercontrol1 类型的 属性 添加到 UserControl2。在 Window 或 UserControl0 构造函数中设置这些属性:

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

确保 UserControls 在 Window.xaml 中有名称(这里的名称 UserControl1 和 UserControl2 只是为了举例)

在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;
    }