WPF 如何从自定义 UserControl 代码访问同级
WPF how to access sibling from custom UserControl code
如果 WPF Window
或 UserControl0
包含另外两个控件:
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,您可以访问 control1
和 control2
。
在这种情况下,如果您希望 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;
}
如果 WPF Window
或 UserControl0
包含另外两个控件:
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,您可以访问 control1
和 control2
。
在这种情况下,如果您希望 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;
}