9

専用のウィンドウからプロジェクターに関する情報を表示するWPFアプリケーションがあります。プロジェクターの表示に使用する画面と、メインのアプリケーションウィンドウに使用する画面を設定したいと思います。

このコードは、指定された画面でプロジェクター出力を生成します。

var screen = GetProjectorScreen();
_projectorWindow = new ProjectorWindow();
_projectorWindow.Left = screen.WorkingArea.Left;
_projectorWindow.Top = screen.WorkingArea.Top;
_projectorWindow.Owner = _parentWindow;
_projectorWindow.Show();


public static Screen GetProjectorScreen()
{
    var screens = Screen.AllScreens;
    if (screens.Length > 1 && Settings.Default.DisplayScreen < screens.Length)
    {
        return screens[Settings.Default.DisplayScreen];
    }
    return screens[0];
}

私はスタートアップフォームで同じトリックをしようとしましたが、これまでのところ成功していません。MainWindowコンストラクターでTopプロパティとLeftプロパティを設定しようとしましたが、機能しませんでした。

スタートアップウィンドウは、StartupUriを設定することにより、App.xaml.csから起動されます。

StartupUri = new Uri("Windows/MainWindow.xaml", UriKind.Relative);

スタートアップフォームを起動する他の方法はありますか?コンストラクターを呼び出そうとしましたが、一部のリソースがロードされなくなったため、クラッシュが発生します。

4

2 に答える 2

10

私はそれを働かせました。ウィンドウの位置を設定する前に、WindowState を Normal に設定する必要があります。また、ウィンドウが作成されるまで、つまりコンストラクターの呼び出し後まで、設定はまったく機能しません。したがって、Windows_Loaded イベントで明示的な設定を呼び出します。ウィンドウを移動する必要がある場合、ちらつきが発生する可能性がありますが、それは私には受け入れられます。

SetScreen メソッドは、画面設定がユーザーによって手動で変更された後にも呼び出す必要があります。

private void SetScreen()
{
    var mainScreen = ScreenHandler.GetMainScreen();
    var currentScreen = ScreenHandler.GetCurrentScreen(this);
    if (mainScreen.DeviceName != currentScreen.DeviceName)
    {
        this.WindowState = WindowState.Normal;
        this.Left = mainScreen.WorkingArea.Left;
        this.Top = mainScreen.WorkingArea.Top;
        this.Width = mainScreen.WorkingArea.Width;
        this.Height = mainScreen.WorkingArea.Height;
        this.WindowState = WindowState.Maximized;
    }
}

バックアップ ScreenHandler ユーティリティは非常に単純です。

public static class ScreenHandler
{
    public static Screen GetMainScreen()
    {
        return GetScreen(Settings.Default.MainScreenId);
    }

    public static Screen GetProjectorScreen()
    {
        return GetScreen(Settings.Default.ProjectorScreenId);
    }

    public static Screen GetCurrentScreen(Window window)
    {
        var parentArea = new Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height);
        return Screen.FromRectangle(parentArea);
    }

    private static Screen GetScreen(int requestedScreen)
    {
        var screens = Screen.AllScreens;
        var mainScreen = 0;
        if (screens.Length > 1 && mainScreen < screens.Length)
        {
            return screens[requestedScreen];
        }
        return screens[0];
    }
}
于 2012-11-05T12:50:01.100 に答える