如果你制作一个 MVVM 应用程序,你的问题就很简单了。对于 1 个 ViewModel(功能),您可以附加多个 View (UI)。在您的情况下,在单个应用程序上,创建 ViewModel 的一个实例并将每个 View 的 DataContext 设置为此视图模型。每个视图可以在不同的显示器上,大小不同,内容不同...
完整示例
首先,创建一个模型(=数据)
using System;
namespace WpfApplication1
{
public class MyModel
{
public String Text1 { get; set; }
public Int32 Int1 { get; set; }
public Int32 Int2 { get; set; }
}
}
然后,一个 ViewModel(数据如何交互并且必须存在)
using System;
namespace WpfApplication1
{
public class MyViewModel
{
private MyModel myModel;
public MyViewModel()
{
this.myModel = new MyModel() { Int1 = 1, Int2 = 12, Text1 = "toto" };
}
public String MyText
{
get { return this.myModel.Text1; }
set { this.myModel.Text1 = value; }
}
public Int32 MyInt1
{
get { return this.myModel.Int1; }
set { this.myModel.Int1 = value; }
}
public Int32 MyInt2
{
get { return this.myModel.Int2; }
set { this.myModel.Int2 = value; }
}
}
}
然后,第一个视图(UI,必须如何显示数据)
<Window x:Class="WpfApplication1.View1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="View1" Height="300" Width="300"
Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"
xmlns:local="clr-namespace:WpfApplication1"
>
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<Grid>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>
此视图的代码(仅 UI 代码)
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for View1.xaml
/// </summary>
public partial class View1 : Window
{
public View1()
{
InitializeComponent();
}
public View1(MyViewModel viewModel)
: this()
{
this.DataContext = viewModel;
}
}
}
第二个视图(与第一个不同)
<Window x:Class="WpfApplication1.View2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="View2" Height="300" Width="300"
Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"
xmlns:local="clr-namespace:WpfApplication1"
>
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" />
<Slider Value="{Binding MyInt1, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" />
</Grid>
</Window>
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for View2.xaml
/// </summary>
public partial class View2 : Window
{
public View2()
{
InitializeComponent();
}
public View2(MyViewModel viewModel)
: this()
{
this.DataContext = viewModel;
}
}
}
第三个视图(第一个和第二个不同)
<Window x:Class="WpfApplication1.View3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="View2" Height="300" Width="300"
Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}"
xmlns:local="clr-namespace:WpfApplication1"
>
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding MyInt1, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" />
<TextBox Text="{Binding MyInt2, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" />
</Grid>
</Window>
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for View3.xaml
/// </summary>
public partial class View3 : Window
{
public View3()
{
InitializeComponent();
}
public View3(MyViewModel viewModel)
: this()
{
this.DataContext = viewModel;
}
}
}
最后,你的起点,所有视图都被调用:
public MainWindow()
{
MyViewModel myOnlyViewModel = new MyViewModel();
View1 view1 = new View1(myOnlyViewModel);
view1.Show();
View2 view2 = new View2(myOnlyViewModel);
view2.Show();
View3 view3 = new View3(myOnlyViewModel);
view3.Show();
}
如您所见,UI 中的每个更改都会显示在其他 UI 中(您不需要启动应用程序的 3 个实例,只需启动 1 个!)。例如,移动滑块将修改 MyInt1 在其他视图中的值。您所要做的就是设计您想要的所有视图,并且始终考虑将数据的生存方式和数据的显示方式分开