C# 从另一个屏幕更改组件

C# 从另一个屏幕更改组件,c#,wpf,C#,Wpf,Tenhos 2窗体,其中一个是usercontrol,另一个是普通窗口。因此,我将该用户控件加载到我的窗口中。我想做的是在单击usercontrol按钮时更改窗口中的值 窗口[用户控件] 当我点击一个用户控制按钮,如“更改颜色窗口”时,我会更改窗口的背景色 这怎么可能 如果我创建一个全局类并放置一个windows类型的对象,我将能够访问它吗?加载UserControl后,您可以使用window.GetWindow方法从UserControl获取对父窗口的引用: public partial c

Tenhos 2窗体,其中一个是usercontrol,另一个是普通窗口。因此,我将该用户控件加载到我的窗口中。我想做的是在单击usercontrol按钮时更改窗口中的值

窗口[用户控件]

当我点击一个用户控制按钮,如“更改颜色窗口”时,我会更改窗口的背景色

这怎么可能


如果我创建一个全局类并放置一个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强制转换为某个特定的窗口类,您打算设置某些属性或调用某些方法好了,我现在明白了:)啊……我是第一个要回答的人,但是有一件事叫
互联网掉了
发生了!:(哈哈