2

有没有什么简单的方法可以防止 WPF 窗口在双显示器设置中跨越多个显示器?“简单”是指不编写测量显示器大小并为窗口分配宽度的代码隐藏。

如果窗口仅使用当前监视器上可用的部分(其中“当前”表示具有当前焦点窗口的监视器),我会更喜欢。如果用户调整窗口大小以使其覆盖两个监视器是可以的,但是在窗口打开时它应该停留在单个监视器上。

这是一个例子:

MainWindow.xaml:

<Window x:Class="MultiMonitorTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Open Window" 
                Height="70" 
                HorizontalAlignment="Left" 
                Margin="165,147,0,0" 
                Name="button1" 
                VerticalAlignment="Top" 
                Width="179" 
                Click="button1_Click" />
    </Grid>
</Window>

MainWINdow.xaml.cs:

using System.Windows;

namespace MultiMonitorTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Window2 win = new Window2();
            win.ShowDialog();
        }
    }
}

Window2.xaml:

<Window x:Class="MultiMonitorTest.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2" 
        SizeToContent="WidthAndHeight">
    <Grid>
        <TextBox x:Name="txt" 
                 Margin="10" 
                 Background="LightPink" 
                 AcceptsTab="True" 
                 AcceptsReturn="True" 
                 TextWrapping="Wrap"/>
    </Grid>
</Window>

Window2.xaml.cs:

using System.Windows;

namespace MultiMonitorTest
{
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            txt.Text = new string('x', 1000);
        }
    }
}

单击“打开窗口”按钮时,新窗口将在两个监视器上打开。如果 Window2 完全停留在当前监视器中,我会更喜欢。

4

1 回答 1

0

好吧,您可以在第二个窗口上使用与父窗口相同的宽度、高度(可能还有位置)。如果没有额外的代码,我认为你不能真正强制窗口跨越两个显示器。但是,您可以使用有限的代码从一个而不是两个启动它。

WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; // in your Window Xaml

//and combine with

Rectangle workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea; // Reference System.Windows.Forms and set left, top, width and height accordingly.

我认为这是您可以做的最好的事情,而无需编写“大量”代码(这会将其置于主屏幕的工作区域)。如果你真的想限制你的窗口跨越多个显示器当然是可能的,但需要一些工作。一个好的起点是WindowInteropHelper类。

于 2012-12-01T13:53:17.040 回答