2011-09-07 110 views
2

我使用WPF Ribbon和Grid应用程序。我不仅需要在主应用程序窗口中显示此Grid,还需要在第二个窗口上显示此Grid。这个Grid包含很多元素,如ToggleButtons,TextBoxes,Images。我的应用程序代码 计划看起来像这样:如何创建显示主窗口的一部分的第二个窗口

<ribbon:RibbonWindow 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     [...] 
     xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     Title="MainWindow" 
     x:Name="RibbonWindow" 
     Height="870" Width="1000"> 

    <Grid x:Name="LayoutRoot"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <ribbon:Ribbon x:Name="Ribbon"> 
     [...] 
     </ribbon:Ribbon> 

     <Grid Background="#FF5C5C5C" Height="765" Width="986" Grid.Row="1" Margin="0,0,-2,-70" x:Name="MainGrid"> 
      <ToggleButton/> 
      <TextBlock /> 
      <ToggleButton/> 
      <Rectangle /> 
      [...] 
     </Grid> 

    </Grid> 
</ribbon:RibbonWindow> 

MainGrid是我想在第二个窗口来显示网格。它甚至只能看到这个网格。但是当我在第一个窗口中改变某些内容时,比如在TextBox中写入内容或者点击ToggleButton,我需要在第二个屏幕上显示它。

+0

更新了我的答案,添加了演示和一些代码,希望它有帮助。 –

回答

3

嗯,这将是棘手。我要做的是用Grid创建一个UserControl,然后在Window1中放置一个UserControl,在Window2中放置另一个UserControl。但是为了同步Window1-Grid和Window2-Grid的状态,你必须将它们绑定到同一个对象上。

编辑:在这里,炮制了一个例子,你

步骤1:GridUserControl因此它可以重复使用。

通知我设置的结合PropertyChanged,这将更新源对象为用户键入UpdateSourceTrigger属性,所以我们会看到Window2变化,因为它们是在Window1发生。

CommonGrid.xaml

<UserControl x:Class="WindowSync.CommonGrid" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="5"> 
      <TextBlock Text="Name: " /> 
      <TextBox Width="200" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
     </StackPanel> 
     <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5"> 
      <CheckBox IsChecked="{Binding IsAdmin, UpdateSourceTrigger=PropertyChanged}" /> 
      <TextBlock Text=" Is Admin" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

步骤2:UserControl成所需的窗户。

注意:您必须引用UserControl所在的命名空间,在这种情况下命名空间为WindowSync,此行允许我们使用命名空间xmlns:app="clr-namespace:WindowSync"

Window1.xaml

<Window x:Class="WindowSync.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:app="clr-namespace:WindowSync" 
     Title="Window 1" Height="200" Width="400"> 
    <app:CommonGrid x:Name="Window1Grid" /> 
</Window> 

Windo1.xaml.cs

public Window1() 
    { 
     InitializeComponent(); 
     Window1Grid.DataContext = Person.User; // bind the UserControl in Window1 to the an object 
     new Window2().Show(); // create an instance of window 2 and show it 
    } 

Window2.xaml

<Window x:Class="WindowSync.Window2" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:app="clr-namespace:WindowSync" 
     Title="Window 2" Height="200" Width="400"> 
    <app:CommonGrid x:Name="Window2Grid" /> 
</Window> 

Window2.xaml.cs

public Window2() 
    { 
     InitializeComponent(); 
     Window2Grid.DataContext = Person.User; // bind the UserControl in Window2 to the same object 
    } 

Person.cs

我刚刚创建了一个叫做人的示范随机对象。

注意:您必须在您的对象上实现接口INotifyPropertyChanged,并在事件发生变化时引发适当的PropertyChanged事件,这就是让我们同步这两个网格。Window1改变了一些东西,PropertyChanged事件被激发,Window2拿起它并进行更改。

public class Person : INotifyPropertyChanged 
{ 
    public static Person User = new Person(); 

    #region Name 
    private string _Name; 
    public string Name 
    { 
     get { return _Name; } 
     set 
     { 
      _Name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
    #endregion 

    #region IsAdmin 
    private bool _IsAdmin; 
    public bool IsAdmin 
    { 
     get { return _IsAdmin; } 
     set 
     { 
      _IsAdmin = value; 
      OnPropertyChanged("IsAdmin"); 
     } 
    } 
    #endregion 

    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 
    #endregion 
} 

Anywyas,我希望这可以帮助你。如果您遇到问题,我会上传项目的压缩版本。 http://www.mediafire.com/?yv84xbben6tjdy7

祝你好运。

+0

非常感谢这段代码!它在'检查'行动中工作得很好。但我有绑定IsEnabled属性的问题。我已经添加了绑定到这样的控件:但它不起作用。当我运行应用程序ToggleButton被禁用,并且当我改变它的状态(使用函数)时,当前状态不会被转移到第二个窗口。 – Marta

+0

嘿,你提高PropertyChanged事件的财产?在这里发布完整的代码,我会尽力帮助你。我现在出发,晚上会回来,我会再看看。 –

+0

我添加了Mode = TwoWay,现在它工作得很好。非常感谢您的帮助! – Marta

相关问题