2010-09-11 127 views
2

我在WPF C#Blend项目中设置了两个窗口。现在我想知道的是(如何在应用程序启动时运行这两个窗口,以及以何种方式将代码从窗口传递到窗口)(我无法找到一些明确的文档)。多个窗口

感谢

回答

3

app.xaml文件的解决方案,它指定了窗口在启动时运行。打开另一个窗口的快速解决方案是在启动窗口的Loaded事件的事件处理程序上打开第二个窗口。

但是,如果这是一个大型项目的一部分,那么解决方案的可扩展性不是太大。有一个单独的类可以打开每个窗口,那么这两个窗口都不需要知道另一个窗口。

至于在它们之间传递数据,使用事件可以提供更松散耦合的解决方案。我会推动更多MVVM(Model-View-ViewModel)架构,然后让每个ViewModel引发其他人可以响应的事件。你可以声明自己的子类EventArgs,它将提供需要传递的信息。

更新

对不起,响应延迟。简单地说,要让一个窗口与另一个窗口共享数据,接收方必须有办法接收这些数据。在接收者中定义一个公共属性将允许发送者通过简单的属性调用来指定数据。默认情况下,窗口的控件是内部的,所以你可以在同一个程序集中访问它们,但这不是最好的方法。

WPF有一个非常丰富的绑定基础结构,您应该利用它。要做到这一点,向窗口提供数据的对象需要实现INotifyPropertyChanged接口。这将提醒用户界面数据已更改,并且绑定应使用已更改的数据更新目标。描述接口的MSDN页面以及示例实现可以在here找到。

当你实现该接口时,会暴露一个事件(PropertyChanged),当数据发生变化时它将触发。向另一个窗口提供数据的对象可以注册一个事件处理程序来侦听这些更改,然后它将具有更新的值。

下面是带有FirstName和LastName属性的简单类的示例实现。

class FirstNameViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string firstName; 
    public string FirstName 
    { 
    get { return firstName; } 
    set 
    { 
     if(firstName == value) 
     return; 

     firstName = value; 
     if(PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
    } 
    } 

    private string lastName; 
    public string LastName 
    { 
    get { return lastName; } 
    set 
    { 
     if(lastName == value) 
     return; 

     lastName = value; 
     if(PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
    } 
    } 
} 

你可以看到这里有一些代码重复 - 这通常被重构为一个基本的ViewModel类。你会看到这暴露了PropertyChanged事件。将事件处理程序附加到它,并在处理程序收到的PropertyChangedEventArgs对象中,PropertyName属性将包含已更改属性的名称(与传递给上面每个设置器中的构造函数的字符串相同)。 sender参数将是对象本身的引用。将其转换为正确的类型,您将可以访问属性。

希望能让你开始。我写了一个非常有人气的样本,如果你想看,我可以上传到某个地方。它打开2个窗口,然后您可以看到在一个窗口中键入会使输入的文本出现在另一个窗口中,反之亦然。

+0

谢谢,你能给我一个例子如何将数据从一个窗口传递到另一个窗口?例如,我可以简单地从另一个窗口访问UI控件吗? – internetmw 2010-09-11 21:42:15

+0

我添加了一些更多的细节以及代码示例。这有帮助吗? – 2010-09-13 03:33:01

0

如果你想通过窗口之间的数据,你应该有一个指针在每个窗口中的另一个窗口。要么是这样,要么你可以阅读使用单例类。如果您希望Windows共享设置,而不是在它们之间发送大量数据,这很方便。

http://www.yoda.arachsys.com/csharp/singleton.html