如果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
获取父窗口。但是如何引用这个兄弟控件呢?
答案 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中的代码隐藏,您可以访问control1
和control2
。
如果您希望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;
}