WPF如何从自定义UserControl代码访问兄弟

时间:2015-12-28 23:27:54

标签: c# wpf user-controls wpf-controls siblings

如果WPF dir/f/i/file1 dir/n/e/newfile2 dir/o/l/oldfile3 Window包含其他两个控件:

UserControl0 - 具有单独xaml和代码隐藏的自定义用户控件

UserControl1 - 具有单独xaml和代码隐藏的自定义用户控件

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

3 个答案:

答案 0 :(得分:1)

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

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

确保UserControls在Window.xaml中有名称(此处名称UserControl1和UserControl2仅供参考)

答案 1 :(得分:0)

为每个控件命名,更准确地说是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

答案 2 :(得分:0)

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