C# 用于多监视器和一个CPU的WPF应用程序

C# 用于多监视器和一个CPU的WPF应用程序,c#,wpf,multiscreen,C#,Wpf,Multiscreen,我已经开发了WPF应用程序,现在将运行多监视器环境。 但我不知道,如何设置我的应用程序,可以运行在这样的环境 我的案例如上图所示,一个CPU和三个屏幕。 现在,我的客户机希望在这些屏幕上运行相同的应用程序。 对于每个屏幕,他也可以进行不同的操作 所以我想知道的是我是否应该启动我的应用程序的3个不同实例。 但在这种情况下,在屏幕1上,用户不应该知道屏幕2和屏幕3用户的其他实例 或者有其他的方法。 因为我不知道如何使用多屏幕。请帮助我 我不确定您是否真的想要创建3个实例,因为这个场景只针对在单个系统

我已经开发了WPF应用程序,现在将运行多监视器环境。 但我不知道,如何设置我的应用程序,可以运行在这样的环境

我的案例如上图所示,一个CPU和三个屏幕。 现在,我的客户机希望在这些屏幕上运行相同的应用程序。 对于每个屏幕,他也可以进行不同的操作

所以我想知道的是我是否应该启动我的应用程序的3个不同实例。 但在这种情况下,在屏幕1上,用户不应该知道屏幕2和屏幕3用户的其他实例

或者有其他的方法。 因为我不知道如何使用多屏幕。请帮助我

我不确定您是否真的想要创建3个实例,因为这个场景只针对在单个系统上工作的单一用户,这是因为CPU只有一个键盘和鼠标,所以我不明白为什么客户端要在同一个应用程序的3个监视器上运行什么

如果是这样的话,那么是的,您将需要3个实例,简单到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();
}