C# 用于多监视器和一个CPU的WPF应用程序
我已经开发了WPF应用程序,现在将运行多监视器环境。 但我不知道,如何设置我的应用程序,可以运行在这样的环境 我的案例如上图所示,一个CPU和三个屏幕。 现在,我的客户机希望在这些屏幕上运行相同的应用程序。 对于每个屏幕,他也可以进行不同的操作 所以我想知道的是我是否应该启动我的应用程序的3个不同实例。 但在这种情况下,在屏幕1上,用户不应该知道屏幕2和屏幕3用户的其他实例 或者有其他的方法。 因为我不知道如何使用多屏幕。请帮助我 我不确定您是否真的想要创建3个实例,因为这个场景只针对在单个系统上工作的单一用户,这是因为CPU只有一个键盘和鼠标,所以我不明白为什么客户端要在同一个应用程序的3个监视器上运行什么 如果是这样的话,那么是的,您将需要3个实例,简单到3个程序在3个不同的屏幕上运行 想了解更多信息,请看一下这个 谢谢C# 用于多监视器和一个CPU的WPF应用程序,c#,wpf,multiscreen,C#,Wpf,Multiscreen,我已经开发了WPF应用程序,现在将运行多监视器环境。 但我不知道,如何设置我的应用程序,可以运行在这样的环境 我的案例如上图所示,一个CPU和三个屏幕。 现在,我的客户机希望在这些屏幕上运行相同的应用程序。 对于每个屏幕,他也可以进行不同的操作 所以我想知道的是我是否应该启动我的应用程序的3个不同实例。 但在这种情况下,在屏幕1上,用户不应该知道屏幕2和屏幕3用户的其他实例 或者有其他的方法。 因为我不知道如何使用多屏幕。请帮助我 我不确定您是否真的想要创建3个实例,因为这个场景只针对在单个系统
Nipun如果您只想处理多个监视器,那么启动同一应用程序的三个实例似乎有点过火。这取决于GUI的设计,但您可以使用来了解系统的屏幕,并相应地布局窗口。有一些属性,如PrimaryScreen和WorkingArea,可以帮助您实现这一点。我知道您正在使用WPF,因此您需要在项目中引用System.Windows.Forms,但我以前做过这件事,没有任何问题。如果您使用MVVM应用程序,您的问题非常简单。对于1视图模型功能,可以附加多个视图UI。在您的情况下,在单个应用程序上,创建ViewModel的一个实例,并将每个视图的DataContext设置为此ViewModel。每个视图可以位于不同的监视器上,大小不同,内容不同 完整示例 首先,创建一个模型=数据
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中的每个更改都显示在其他UI中,您不需要启动应用程序的3个实例,只需启动1个!。例如,移动滑块将修改其他视图中MyInt1的值。你所要做的就是设计你想要的所有视图,如果我的理解是正确的,那么一定要把数据的活动方式和数据的显示方式分开。每个监视器/用户需要一个exe和多个窗口 比如说,如果你有一个按钮1,点击事件创建一个 Window1 obje=新Window1;对象显示 在每次单击时创建一个新的窗口实例,并为每个窗口提供一个id,然后执行您的过程。 若要在MainWindow中持久化每个窗口实例,请将它们保存在列表或字典中 有一个类杠杆变量 Private Disctionary OpenWIndows=新建Disctionary;专用整数计数器=0;Window1 obje=新Window1;计数器++;Obje.WIndowId=计数器;OpenWIndows.AddCounter,obje;对象显示 因此,现在您可以使用OpenWIndows
在Window1类中,您可以根据您的计数器为特定类型的用户编写代码。我的客户端将使用touch MonitorSure,请阅读上面的链接,它将让您了解多个监视器。1实例,MVVM。3视图,1视图模型不要使用应用程序的3个实例,请使用MVVM。请参阅答案中的完整示例。使用它,我只能处理GUI,我的Que是如果屏幕1用户按“保存”按钮,那么屏幕2将看不到它@Richard@khushbu对不起,我不明白。当然这取决于您的视图和视图模型设计?Thanx对于您的答复,我将尝试使用您的suggestion@Xaruth@khushbu不要忘记将好的答案标记为已验证;正如与我的团队讨论的那样,这对我来说是无效的,因为应用程序的用户没有变化。。所以我不太明白你的论点。也许你的问题不完整。祝你好运。
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();
}