gpt4 book ai didi

c# - 如何创建显示部分主窗口的第二个窗口

转载 作者:行者123 更新时间:2023-11-30 22:35:47 25 4
gpt4 key购买 nike

我有 WPF 功能区和网格的应用程序。而且我不仅需要在主应用程序窗口中而且还需要在第二个窗口中显示此网格。此网格包含许多元素,如 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 是我想在第二个窗口中显示的网格。它甚至可以是这个网格的唯一 View 。但是当我在第一个窗口中更改某些内容时,例如在 TextBox 中写一些内容或单击 ToggleButton,我也需要在第二个屏幕上显示它。

最佳答案

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

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

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

请注意,我将绑定(bind)上的 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 所在的 namespace ,在本例中 namespace 是 WindowSync,这一行让我们使用 namespace 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 接口(interface),并在发生更改时引发相应的 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
}

无论如何,我希望这对你有所帮助。如果你遇到困难,我上传了项目的压缩版本。 http://www.mediafire.com/?yv84xbben6tjdy7

祝你好运。

关于c# - 如何创建显示部分主窗口的第二个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7333693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com