ウィンドウの起動時に、TaskBar
の時計の上にウィンドウを表示したい。
デスクトップの右下隅の場所を見つけるにはどうすればよいですか?
私は、Windowsフォームアプリではうまく機能するが、WPFでは正しく機能しないこのコードを使用します。
var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
このコードは、ディスプレイ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
デスクトップの四角形にアクセスするには、 Screen class -Screen.PrimaryScreen.WorkingArea
プロパティはデスクトップの長方形です。
WPFウィンドウには、Top
とLeft
のプロパティに加えてWidth
とHeight
のプロパティがあるため、デスクトップの場所に関連してこれらのプロパティを設定できます。
ウィンドウのサイズが変わったときにコーナーでstayにしたい場合は、SizeChanged
の代わりにウィンドウのLoaded
イベントを使用できます。これは、ウィンドウのWindow.SizeToContent
がSizeToContent.Manual
以外の値に設定されている場合に特に便利です。この場合、コーナーに留まりながらコンテンツに合わせて調整されます。
public MyWindow()
{
SizeChanged += (o, e) =>
{
var r = SystemParameters.WorkArea;
Left = r.Right - ActualWidth;
Top = r.Bottom - ActualHeight;
};
InitializeComponent();
}
また、ActualWidth
とActualHeight
(他の応答で示されているWidth
とHeight
の代わりに)を減算して、より起こりうる状況を処理する必要があることにも注意してください。実行時にSizeToContent
モードを切り替える。
私のコード:
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);
};
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に渡されます)。
上記のソリューションは、私のウィンドウでは完全に機能しませんでした-低すぎて、ウィンドウの下部がタスクバーの下とデスクトップワークスペースの下にありました。ウィンドウのコンテンツがレンダリングされた後、位置を設定する必要がありました。
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ずつ調整する必要がありました。これが私の状況でなぜ必要なのかわかりません。