我有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,我也需要在第二个窗口中显示它。
答案 0 :(得分:3)
编辑:在这里,为你做了一个例子
第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
祝你好运。