如何创建显示主窗口一部分的第二个窗口

时间:2011-09-07 12:12:20

标签: c# .net wpf xaml desktop-application

我有WPF功能区和网格的应用程序。我需要不仅在主应用程序窗口中而且在第二个窗口中显示此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是我想在第二个窗口中显示的网格。它甚至可以只查看此Grid。但是当我在第一个窗口中更改某些内容时,比如在TextBox中编写内容或单击ToggleButton,我也需要在第二个窗口中显示它。

1 个答案:

答案 0 :(得分:3)

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

编辑:在这里,为你做了一个例子

第1步:Grid放入UserControl,以便重复使用。

注意我将绑定的UpdateSourceTrigger属性设置为PropertyChanged,这会在用户输入时更新源对象,因此我们会看到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

我刚刚为演示创建了一个名为person的随机对象。

注意:您必须在对象上实现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

祝你好运。