14

I am currently creating a sidebar-like WPF application in C#. When a user starts the application, I would like the window to automatically position it's self to the side of the user's screen. I have tried a few methods and google searches, but have not found any help.

Here's an example of what I'm trying to do:

http://prntscr.com/5tfkz

How can I efficiently go about achieving something like this?


@dknaack

I tried this code:

private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            this.Left = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right - this.Width;
            this.Top = 0;
            this.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;

        }

and got the following errors:

Error 1 The type 'System.Drawing.Size' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. C:\Users\Test\Documents\Expression\Blend 4\Projects\WindBar_Prototype_1\WindBar_Prototype_1\MainWindow.xaml.cs 32 13 WindBar_Prototype_1

and

Error 2 'System.Drawing.Size' does not contain a definition for 'Width' and no extension method 'Width' accepting a first argument of type 'System.Drawing.Size' could be found (are you missing a using directive or an assembly reference?) C:\Users\Test\Documents\Expression\Blend 4\Projects\WindBar_Prototype_1\WindBar_Prototype_1\MainWindow.xaml.cs 32 78 WindBar_Prototype_1

Any help?

Kiquenet
  • 14,494
  • 35
  • 148
  • 243
anonymous
  • 1,111
  • 1
  • 10
  • 18

6 Answers6

17

Description

You can use Screen from System.Windows.Forms.

So add reference to the System.Windows.Forms.dll and System.Drawing.dll. Then change the Left and Height property in the MainWindow_Loaded method.

Sample

public MainWindow()
{
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    this.Left = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right - this.Width;
    this.Top = 0;
    this.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
}

More Information

Community
  • 1
  • 1
dknaack
  • 60,192
  • 27
  • 155
  • 202
  • @JamesDidzun Did you referenced `System.Drawing.dll` too ? – dknaack Feb 02 '12 at 23:03
  • Okay, I just tried that, and I didn't have any trouble building it anymore. The only problem is, it's not on the side of the screen! Look: http://prntscr.com/5th4q - Thank again – anonymous Feb 02 '12 at 23:05
  • Looks like the event gets not fired. You can set a breakpoint to see if the method get called. Check out my updated answer `this.Loaded += new RoutedEventHandler(MainWindow_Loaded);` – dknaack Feb 02 '12 at 23:07
  • Actually, I figured out the problem. I had some empty space in the window... Haha. Thanks for your help! -Best Answer- – anonymous Feb 02 '12 at 23:08
  • One more thing... How can I get the side bar on to the right side instead of the left? – anonymous Feb 02 '12 at 23:16
  • I think you mean on the left instead the right ? In my answer your window is on the right side of the primary screen. – dknaack Feb 02 '12 at 23:18
  • Are you sure that `MainWindow_Loaded` get called ? Set a breakpoint please. – dknaack Feb 02 '12 at 23:37
  • Nevermind... I somehow fixed it... Thanks for all of your help, dknaack. Regards, James – anonymous Feb 02 '12 at 23:47
  • Where is this method or event located? – Nathan McKaskle Apr 02 '14 at 17:55
5

You can do this without referencing win forms assemblies by using SystemParameters. In the code behind for your window XAML:

MainWindow() {
    InitializeComponents();

    this.Loaded += new RoutedEventHandler(
      delegate(object sender, RoutedEventArgs args) {
        Width = 300;
        Left = SystemParameters.VirtualScreenLeft;
        Height = SystemParameters.VirtualScreenHeight;
    }
}

SystemParameters documentation

KurToMe
  • 166
  • 1
  • 6
  • `System.Windows.Forms.Screen.PrimaryScreen` is better for the situations you have more than 1 screen – MikroDel Dec 12 '12 at 12:33
  • How is it better MikroDel? I'm using a tripple monitor setup, two side by side, and the third one is above the two right in the middle. With SystemParameters I actually got everything I needed. – Steven Borges Feb 17 '16 at 14:53
2

in your xaml :

WindowStartupLocation="Manual" 

in the constructor :

 Left = System.Windows.SystemParameters.PrimaryScreenWidth - Width
 Top=0
GameAlchemist
  • 18,995
  • 7
  • 36
  • 59
1
public MainWindow()
{
    InitializeComponent();
    WindowStartupLocation = WindowStartupLocation.Manual;
    Left =  System.Windows.Forms.SystemInformation.PrimaryMonitorSize.Width - Width;
}
Eugene Cheverda
  • 8,760
  • 2
  • 33
  • 18
0

use startPosition property or location property

yoozz
  • 247
  • 2
  • 15
-1
<body>
<script>
function myfunc()
{
    w1=window.open('http://www.google.com','Google','left=0,top=0,width=250px,height=250px');
    w2=window.open('http://www.yahoomail.com','Yahoo Mail','left=1166,top=0,width=250px,height=250px');
    w3=window.open('http://www.people.com','People Magazine','left=1166,top=500,width=250px,height=250px');
    w4=window.open('http://www.time.com','Time Magazines','left=0,top=500,width=250px,height=250px');
    w5=window.open('http://www.ew.com','Entertainment Weekly','left=550,top=250,width=250px,height=250px');

}

function myclose()
{
 w1.close(); w2.close(); w3.close(); w4.close(); w5.close();
 w6=window.open('smartwindow.html',' mywindow',',');
}
</script>
    <div id="cover">
    <img src="images/abstract.jpeg" id="1" width="500px" height="400px" alt="color defined"onClick="myfunc()"/>
     <input type="button" value="click to close all windows" onClick="myclose()"/>
     </div>
</body>
Imane Fateh
  • 2,418
  • 3
  • 19
  • 23