我开发了WPF应用程序,现在将运行Multi Monitor Env。 但我不知道,如何设置我的应用程序可以在这样的环境中运行。
我的案例如上图,一个CPU和三个屏幕。 现在我的客户想要在这些屏幕上运行相同的应用程序。 而且对于每个屏幕,他都可以进行不同的操作。
所以我想知道我应该启动3个不同的应用程序实例。 但是在屏幕1的情况下,用户不应该知道屏幕2和屏幕3用户的其他实例。
或者有任何替代方式。 因为我不知道如何使用多个屏幕。请帮助我
答案 0 :(得分:0)
Khusbhu,
我不确定你是否真的想要创建3个实例,因为这个场景仅供单个系统使用,这是因为CPU只有一个键盘和鼠标,所以我不明白为什么客户端在3个监视器上运行什么相同的应用程序。
如果是的话就是这样,那么是的,你将需要3个实例,它就像在3个不同的屏幕上运行的3个程序一样简单。
更多想法看看这个 http://www.pugetsystems.com/labs/articles/How-to-Set-Up-Multiple-Monitors-140/
由于 Nipun
答案 1 :(得分:0)
如果你想要做的只是处理多个监视器,那么启动同一个应用程序的三个实例似乎有点过分。这取决于GUI的设计,但您可以使用Screen.AllScreens查找系统具有的屏幕并相应地布置窗口。 Screen有一些属性,例如PrimaryScreen
和WorkingArea
,可以帮助您解决此问题。我知道您正在使用WPF,因此您需要在项目中引用System.Windows.Forms
,但我在过去没有遇到任何问题。
答案 2 :(得分:0)
如果您制作MVVM应用程序,问题非常简单。对于1个ViewModel(fonctionnality),您可以附加许多View(UI)。在您的情况下,在单个应用程序上,创建一个ViewModel实例,并将每个View的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代码)
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;
}
}
}
第3个视图(第一个和第二个视图不同)
<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的值。您所要做的就是设计所需的所有视图,并始终考虑分离数据的生存方式以及数据的显示方式
答案 3 :(得分:0)
如果我的理解是正确的。每个监视器/用户需要一个exe和多个窗口。
例如,如果你有一个创建
的Button1和click事件Window1 obje = 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类中,您可以根据计数器为特定类型的用户编写代码。