我开发了 WPF 应用程序,现在将运行 Multi Monitor Env。但我不知道,如何设置可以在这样的环境中运行的应用程序。
我的案例如上图,一个 CPU 和 3 个屏幕。现在我的客户想在这些屏幕上运行相同的应用程序。并且还可以针对每个画面进行不同的操作。
所以我想知道我是否应该启动我的应用程序的 3 个不同实例。但在这种情况下,屏幕 1 上的用户不应该知道屏幕 2 和屏幕 3 用户的其他实例。
或者有任何替代方法。因为我不知道如何使用多个屏幕。请帮助我
我开发了 WPF 应用程序,现在将运行 Multi Monitor Env。但我不知道,如何设置可以在这样的环境中运行的应用程序。
我的案例如上图,一个 CPU 和 3 个屏幕。现在我的客户想在这些屏幕上运行相同的应用程序。并且还可以针对每个画面进行不同的操作。
所以我想知道我是否应该启动我的应用程序的 3 个不同实例。但在这种情况下,屏幕 1 上的用户不应该知道屏幕 2 和屏幕 3 用户的其他实例。
或者有任何替代方法。因为我不知道如何使用多个屏幕。请帮助我
库斯布,
我不确定您是否真的要创建 3 个实例,因为这种情况仅适用于在单个系统上工作的单人使用,这是因为 CPU 只有一个键盘和鼠标,所以我不明白为什么客户端要做什么在 3 台显示器上运行相同的应用程序。
如果是这样,那么是的,您将需要 3 个实例,它就像在 3 个不同屏幕上运行的 3 个程序一样简单。
有关更多想法,请查看此 http://www.pugetsystems.com/labs/articles/How-to-Set-Up-Multiple-Monitors-140/
谢谢尼朋
如果我的理解是正确的。您需要为每个监视器/用户拥有一个 exe 和多个窗口。
例如,如果您有一个 Button1 和 click 事件来创建一个
Window1 对象 = new Window1();Obje.Show();
在每次点击时创建一个新窗口实例,并为每个窗口提供一个 id 并执行您的过程。如果要在 MainWindow 中保留每个窗口实例,请将它们保留在 List 或 Dictionary 中有一个类杠杆变量
Private Disctionary OpenWINdows = new Disctionary ();Private int Counter = 0;Window1 obje = new Window1();Counter ++;Obje.WIndowId = Counter;OpenWIndows.Add(Counter, obje);Obje.Show();
因此,现在您可以使用 OpenWINdows 在 Window1 类中,您可以根据您的计数器为特定类型的用户编写代码。
如果您只想处理多个监视器,那么启动同一应用程序的三个实例似乎有点矫枉过正。这取决于您的 GUI 的设计,但您可以使用Screen.AllScreens来了解系统具有的屏幕并相应地布局您的窗口。Screen有一些类似的属性PrimaryScreen
,WorkingArea
可以帮助您解决这个问题。我知道你正在使用 WPF,所以你需要System.Windows.Forms
在你的项目中引用,但我过去这样做没有问题。
如果您制作 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 在其他视图中的值。您所要做的就是设计您想要的所有视图,并且始终考虑将数据如何生存和数据如何显示分开