0

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

在此处输入图像描述

我的案例如上图,一个 CPU 和 3 个屏幕。现在我的客户想在这些屏幕上运行相同的应用程序。并且还可以针对每个画面进行不同的操作。

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

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

4

4 回答 4

0

库斯布,

我不确定您是否真的要创建 3 个实例,因为这种情况仅适用于在单个系统上工作的单人使用,这是因为 CPU 只有一个键盘和鼠标,所以我不明白为什么客户端要做什么在 3 台显示器上运行相同的应用程序。

如果是这样,那么是的,您将需要 3 个实例,它就像在 3 个不同屏幕上运行的 3 个程序一样简单。

有关更多想法,请查看此 http://www.pugetsystems.com/labs/articles/How-to-Set-Up-Multiple-Monitors-140/

谢谢尼朋

于 2014-03-05T09:19:00.120 回答
0

如果我的理解是正确的。您需要为每个监视器/用户拥有一个 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 类中,您可以根据您的计数器为特定类型的用户编写代码。

于 2014-03-05T09:44:44.980 回答
0

如果您只想处理多个监视器,那么启动同一应用程序的三个实例似乎有点矫枉过正。这取决于您的 GUI 的设计,但您可以使用Screen.AllScreens来了解系统具有的屏幕并相应地布局您的窗口。Screen有一些类似的属性PrimaryScreenWorkingArea可以帮助您解决这个问题。我知道你正在使用 WPF,所以你需要System.Windows.Forms在你的项目中引用,但我过去这样做没有问题。

于 2014-03-05T09:21:14.973 回答
0

如果您制作 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 在其他视图中的值。您所要做的就是设计您想要的所有视图,并且始终考虑将数据如何生存和数据如何显示分开

于 2014-03-05T09:27:48.240 回答