【问题标题】:WPF Application for Multi-Monitor and One CPU用于多显示器和一个 CPU 的 WPF 应用程序
【发布时间】:2014-03-05 09:10:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 1 个实例,MVVM。 3 个视图,1 个视图模型
  • 不要使用应用程序的 3 个实例,使用 MVVM。在答案中查看我的完整示例。

标签: c# wpf multiscreen


【解决方案1】:

胡布,

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

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

更多的想法看看这个 http://www.pugetsystems.com/labs/articles/How-to-Set-Up-Multiple-Monitors-140/

谢谢 尼朋

【讨论】:

  • 我的客户将使用触控显示器
  • 当然,请阅读上面的链接,它会让您了解多显示器。
【解决方案2】:

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

【讨论】:

  • 使用它我只能处理 GUI,我的问题是如果屏幕 1 用户按下按钮保存,那么这对屏幕 2 @Richard 不可见
  • @khushbu 抱歉,我不明白。这肯定取决于您的 View 和 ViewModel 设计吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 感谢您的回复,我会尝试您的建议@Xaruth
    • @khushbu 不要忘记将好的答案标记为已验证;)
    • 与我的团队讨论过,这对我无效,因为应用程序的用户数量不同。所以谢谢回复
    • 我不确定你的论点。可能是你的问题不完整。祝你好运。
    猜你喜欢
    • 2012-11-21
    • 2020-03-29
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多