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

时间:2014-03-05 09:10:37

标签: c# wpf multiscreen

我开发了WPF应用程序,现在将运行Multi Monitor Env。 但我不知道,如何设置我的应用程序可以在这样的环境中运行。

enter image description here

我的案例如上图,一个CPU和三个屏幕。 现在我的客户想要在这些屏幕上运行相同的应用程序。 而且对于每个屏幕,他都可以进行不同的操作。

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

或者有任何替代方式。 因为我不知道如何使用多个屏幕。请帮助我

4 个答案:

答案 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有一些属性,例如PrimaryScreenWorkingArea,可以帮助您解决此问题。我知道您正在使用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类中,您可以根据计数器为特定类型的用户编写代码。