【问题标题】:Select display for application为应用选择显示器
【发布时间】:2021-03-01 16:44:19
【问题描述】:

背景:我的笔记本通常放在一个扩展坞中,一个大屏幕连接到该扩展坞。 (WPF) 应用程序的图标位于笔记本的屏幕上。 Windows(7、64 位)在笔记本显示器而不是大显示器上打开应用程序。

我可以将图标移动到大显示器上,Windows 将在该显示器上打开应用程序。但是在启动未连接到扩展坞的笔记本后,该图标再次放置在笔记本的显示器上(我实际上更喜欢将它放在小屏幕上)...

我找到了一些以编程方式设置应用程序主窗口位置的代码,请参阅How to set WPF window position in secondary display 这有效 - 但是:仅适用于主窗口。所有其他窗口都在图标所在的屏幕上打开。

现在,我也可以指定所有其他窗口的位置。或者我可以编写一些代码来存储窗口关闭时的位置,同时记住屏幕(首选或其他),然后根据可用屏幕在加载窗口时重新设置它。

但这太过分了:实际上,我只是想指定窗口在可用时在大屏幕上的某个位置打开 - 我什至不关心屏幕上的确切位置(Windows 可以确定它的方式现在可以)。

您能提出什么简单的解决方案?

【问题讨论】:

  • 我想知道你所说的“矫枉过正”是什么意思。您当然可以编写一些代码来实现您的目的,但您不希望它对吗?

标签: wpf screen


【解决方案1】:

我建议你创建一个继承“Window”类的新类,将代码放在新窗口中,然后在所有窗口中使用它。

例子:

using System.Windows;

namespace WpfApp2
{
    public class Custom_Window_Class : Window
    {
        // Your code to reposition window (timer ...)
    }
}

==================================

<local:Custom_Window_Class x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
    </Grid>
</local:Custom_Window_Class>

========================================

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Custom_Window_Class
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

【讨论】:

  • 感谢您的帮助。不幸的是,这个问题更加复杂。除了必须触摸所有窗口之外,它不能与 MessageBoxes、OpenFileDialog、SplashScreen 一起应用......而且重新定位的代码不是最佳的(我必须指定 Top 和 Left,尽管我只对屏幕感兴趣)。
【解决方案2】:

不幸的是,我不得不触摸每一个窗口才能把事情做好——我想称之为 WTF。

如果是System.Windows.Window 类型,则必须设置Owner 属性及其window.WindowStartupLocation = WindowStartupLocation.CenterOwner;。同样,这指定了比我想指定的更多的细节。

如果是OpenFileDialog,则必须在其ShowDialog方法中提供所有者;在其Show方法中使用MessageBox。

我认为对于这样一个简单的问题来说代码太多了,而且需要指定的代码比我实际想要指定的要多得多。最后,许多 WPF 问题最终证明是 WTF。

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多