WPF如何从自定义UserControl代码访问同级
本文关键字:代码 访问 UserControl 自定义 WPF | 更新日期: 2023-09-27 18:28:28
如果存在包含两个其他控件的WPF Window
或UserControl0
:
UserControl1
-自定义用户控件,带有单独的xaml和后面的代码
UserControl2
-自定义用户控件,带有单独的xaml和后面的代码
如何从UserControl2
代码后面访问/引用UserControl1
?我知道我可以通过使用this.Parent
(继承自FrameworkElement.Parent
)从代码后面获得父窗口,也可以通过Window.GetWindow(this)
获得父窗口。但是引用这个同级控件呢?
我认为这是一种糟糕的做法,仍然很容易实现。将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中的代码隐藏,您可以访问control1
和control2
。
在这种情况下,如果希望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;
}