C# 从另一个屏幕更改组件
Tenhos 2窗体,其中一个是usercontrol,另一个是普通窗口。因此,我将该用户控件加载到我的窗口中。我想做的是在单击usercontrol按钮时更改窗口中的值 窗口[用户控件] 当我点击一个用户控制按钮,如“更改颜色窗口”时,我会更改窗口的背景色 这怎么可能C# 从另一个屏幕更改组件,c#,wpf,C#,Wpf,Tenhos 2窗体,其中一个是usercontrol,另一个是普通窗口。因此,我将该用户控件加载到我的窗口中。我想做的是在单击usercontrol按钮时更改窗口中的值 窗口[用户控件] 当我点击一个用户控制按钮,如“更改颜色窗口”时,我会更改窗口的背景色 这怎么可能 如果我创建一个全局类并放置一个windows类型的对象,我将能够访问它吗?加载UserControl后,您可以使用window.GetWindow方法从UserControl获取对父窗口的引用: public partial c
如果我创建一个全局类并放置一个windows类型的对象,我将能够访问它吗?加载
UserControl
后,您可以使用window.GetWindow
方法从UserControl
获取对父窗口的引用:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window parentWindow = Window.GetWindow(this);
if (parentWindow != null)
parentWindow.Background = Brushes.Yellow;
}
}
这很简单。有很多方法可以实现这一点。我将列出简单的选项: 在
用户控件
中创建一个事件,引发它并收听它
在UserControl
中,创建一个public
事件:
>UserControl.Cs
public Event EventHandler MyEvent;
///raise the event
private void btn_Click(object sender, RoutedEventArgs e)
{
MyEvent(this , e);
}
Usercontrol1.MyEvent += new System.EventHandler(this.MyMethod);
pirvate void MyMethod
{
////do stuff here
}
>Wndows.Cs
public Event EventHandler MyEvent;
///raise the event
private void btn_Click(object sender, RoutedEventArgs e)
{
MyEvent(this , e);
}
Usercontrol1.MyEvent += new System.EventHandler(this.MyMethod);
pirvate void MyMethod
{
////do stuff here
}
使用GetWindow
方法
您可以简单地使用GetWindow
方法:
private void btn_Click()
{
Window parent = Window.GetWindow(this);
///code here
}
使用VisualTreeHelper
下面是一个可以用来查找控件父级的函数。这非常有用,因为它不仅可以让您获取窗口,还可以获取子窗口的任何父级,例如StackPanel
,Grid
等
public static T FindParent<T>(DependencyObject child)where T : DependencyObject
{
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null)
return null;
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
////Call it like this :
var parent = FindParent<Window>(this);
公共静态T FindParent(DependencyObject子对象),其中T:DependencyObject
{
DependencyObject parentObject=VisualTreeHelper.GetParent(子级);
if(parentObject==null)
返回null;
T parent=parentObject作为T;
如果(父项!=null)
返回父母;
其他的
返回FindParent(parentObject);
}
////可以这样称呼:
var parent=FindParent(此);
希望这有帮助:)我可以问一下为什么要检查parentWindow是否为null吗?因为最好的做法是总是检查引用是否有效以避免NullReferenceExceptions:)不过,您不需要在这里这样做,除非您将parentWindow强制转换为某个特定的窗口类,您打算设置某些属性或调用某些方法好了,我现在明白了:)啊……我是第一个要回答的人,但是有一件事叫
互联网掉了发生了!:(哈哈