53

I'd like to have a WPF window open in the top right part of the screen.

Right now I can achieve that by opening the window and then moving it (via movewindow in user32.dll). However, this approach means the window opens in it's default location, fully loads, and then moves to the top right.

How could I do I change it so that I could specify the window's initial position and size?

animuson
  • 53,861
  • 28
  • 137
  • 147
Evan
  • 4,450
  • 10
  • 40
  • 58

6 Answers6

115

Just set WindowStartupLocation, Height, Width, Left, and Top in xaml:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="500" Width="500"
    WindowStartupLocation="Manual" 
    Left="0" Top="0">
</Window>
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
  • 1
    Thanks!! I knew it had to be simple, but of course I tried to find the complicated solution :). – Evan Oct 09 '09 at 18:12
  • 2
    Great! This is what I was looking for `win.WindowStartupLocation = `[WindowStartupLocation](https://msdn.microsoft.com/en-us/library/system.windows.windowstartuplocation(v=vs.110).aspx)`.CenterScreen;` – marbel82 Nov 29 '16 at 15:04
  • @Evan Didn't you look for "top **right** part of the screen"? Wouldn't it have to be `Left = ScreenWidth - 500` (which shouldn't be THAT EASY in xaml)? – The incredible Jan Oct 12 '22 at 07:58
9

I like to use WindowStartupLocation="CenterOwner" (MSDN docs for it)

The caller needs to specify itself as owner for this to work though, such as:

new MyWindow() { Owner = this }.ShowDialog();

Then just define the window height and width, e.g:

<Window ...
     Height="400" Width="600"
     WindowStartupLocation="CenterOwner"
>
...
noelicus
  • 14,468
  • 3
  • 92
  • 111
7

For people who like me wanted to set the position of the window to the current mouse position, you can do it like this:

myWindow.WindowStartupLocation = WindowStartupLocation.Manual;
myWindow.Left = PointToScreen(Mouse.GetPosition(null)).X;
myWindow.Top = PointToScreen(Mouse.GetPosition(null)).Y;
  • 1
    I receive an error: `System.InvalidOperationException: 'This Visual is not connected to a PresentationSource.'` – Jeson Martajaya Oct 24 '19 at 06:17
  • Hi Jeson! Although I don't know the source of your problem, I think this thread may have some useful anwers: https://stackoverflow.com/questions/2154211/in-wpf-under-what-circumstances-does-visual-pointfromscreen-throw-invalidoperat. It seems that the visual needs to be visible in order for PointToScreen to work. Drew Noakes had this solution to that problem: "I've found you can test IsVisible before calling PointFromScreen to protect against the InvalidOperationException.". Hope this helps. – Christian Larsson Oct 24 '19 at 10:31
1

There is a property for Window, called "WindowStartupLocation" You can find that in properties window. Simply just select Window in constructor, then go to properties list. Search for "Startup" or smth similar and you can find that property. Change it to "CenterScreen" and it will make the deal. NOTE! Make sure, that you did not select grid instead of window! Otherwise you`ll fail.

Or you just can done it via XAML editing as some guys wrote before.

Nuisance
  • 286
  • 1
  • 2
  • 15
0

This is what worked for me (with a different placement on screen):

<Window x:Class="BtnConfig.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:BtnConfig"
        mc:Ignorable="d"
        Title="MainWindow" Height="142.802" Width="448.089"
        Top="288" Left="0"> 
</Window>

Notice it does not contain:

WindowStartupLocation="Manual" 
0

In my case I want my "Find" tool box to appear top-right corner of the RichTextBox control.

enter image description here

It is done with this code:

    // Assumes variable: RichTextBox m_Box, Window m_FindWordDialog
    m_FindWordDialog.Show( ); // Let dialog show itself first

    // Note: I had to use ActualWidth because m_Box.Width somehow is (NaN) in my case
    // Not tested in different DPI.
    Point locationFromScreen = m_Box.PointToScreen( new Point(m_Box.ActualWidth, 0) );
    m_FindWordDialog.Left = locationFromScreen.X - m_FindWordDialog.Width;
    m_FindWordDialog.Top = locationFromScreen.Y;

My search window XAML has following properties.

WindowStartupLocation="Manual" Left="0" Top="0"

It will briefly appear on its initial location and jump a bit, but I can live with it. Actually any value is fine, WindowStartupLocation="CenterOwner" also work, it just jump from center of parent. Or as dirty workaround, you could use manual mode and let it start in faraway position to not let user see jumping.

To make it appear relative on desktop position, acquire the screen workspace location, you can check: How to set the location of WPF window to the bottom right corner of desktop?

Wappenull
  • 1,181
  • 13
  • 19