web-dev-qa-db-ja.com

WPFウィンドウの場所をデスクトップの右下隅に設定する方法は?

ウィンドウの起動時に、TaskBarの時計の上にウィンドウを表示したい。

デスクトップの右下隅の場所を見つけるにはどうすればよいですか?

私は、Windowsフォームアプリではうまく機能するが、WPFでは正しく機能しないこのコードを使用します。

var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
51
VirtualWorld

このコードは、ディスプレイ100%と125%の両方でWPFで動作します

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
    var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
    this.Left = desktopWorkingArea.Right - this.Width;
    this.Top = desktopWorkingArea.Bottom - this.Height;
 }

簡単に言うと

System.Windows.SystemParameters.WorkArea

の代わりに

System.Windows.Forms.Screen.PrimaryScreen.WorkingArea

104
Klaus78

デスクトップの四角形にアクセスするには、 Screen class -Screen.PrimaryScreen.WorkingAreaプロパティはデスクトップの長方形です。

WPFウィンドウには、TopLeftのプロパティに加えてWidthHeightのプロパティがあるため、デスクトップの場所に関連してこれらのプロパティを設定できます。

10
Amittai Shapira

ウィンドウのサイズが変わったときにコーナーでstayにしたい場合は、SizeChangedの代わりにウィンドウのLoadedイベントを使用できます。これは、ウィンドウのWindow.SizeToContentSizeToContent.Manual以外の値に設定されている場合に特に便利です。この場合、コーナーに留まりながらコンテンツに合わせて調整されます。

public MyWindow()
{
    SizeChanged += (o, e) =>
    {
        var r = SystemParameters.WorkArea;
        Left = r.Right - ActualWidth;
        Top = r.Bottom - ActualHeight;
    };
    InitializeComponent();
}

また、ActualWidthActualHeight(他の応答で示されているWidthHeightの代わりに)を減算して、より起こりうる状況を処理する必要があることにも注意してください。実行時にSizeToContentモードを切り替える。

4
Glenn Slayden

私のコード:

MainWindow.WindowStartupLocation = WindowStartupLocation.Manual;

MainWindow.Loaded += (s, a) =>
{
    MainWindow.Height = SystemParameters.WorkArea.Height;
    MainWindow.Width = SystemParameters.WorkArea.Width;
    MainWindow.SetLeft(SystemParameters.WorkArea.Location.X);
    MainWindow.SetTop(SystemParameters.WorkArea.Location.Y);
};
3
Cyclion

MessageDisplayという名前のラベルを含む新しいウィンドウでこの問題を解決しました。ウィンドウに付随するコードは次のとおりです。

public partial class StatusWindow : Window
{
    static StatusWindow display;

    public StatusWindow()
    {
        InitializeComponent();
    }

    static public void DisplayMessage( Window parent, string message )
    {
        if ( display != null )
            ClearMessage();
        display = new StatusWindow();
        display.Top = parent.Top + 100;
        display.Left = parent.Left + 10;
        display.MessageDisplay.Content = message;
        display.Show();
    }

    static public void ClearMessage()
    {
        display.Close();
        display = null;
    }
}

私のアプリケーションでは、topとleftの設定により、このウィンドウはメインウィンドウのメニューの下に配置されます(最初のパラメーターでDisplayMessageに渡されます)。

1
George Hahn

上記のソリューションは、私のウィンドウでは完全に機能しませんでした-低すぎて、ウィンドウの下部がタスクバーの下とデスクトップワークスペースの下にありました。ウィンドウのコンテンツがレンダリングされた後、位置を設定する必要がありました。

private void Window_ContentRendered(object sender, EventArgs e)
{
    var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
    this.Left = desktopWorkingArea.Right - this.Width - 5;
    this.Top = desktopWorkingArea.Bottom - this.Height - 5;
}

また、フレームの一部が見えなくなっていたため、5ずつ調整する必要がありました。これが私の状況でなぜ必要なのかわかりません。

0
PIntag