Workaround: Silverlight OOB error when maximizing second monitor with borderless chrome


there bug in silverlight occurs when out-of-browser (oob) app that has borderless chrome  maximizes the window on a second monitor.  window either doesn't display @ all or small part of displays. 

i developed workaround.  seems work ok laptop , second monitor, haven't tested anywhere else. 

caveats:

it may not work if primary window attached monitor.  further tweaking address that.

it gets information windows, don't know if work computers aren't running windows, such apple.

        void minimizebutton_click(object sender, routedeventargs e)          {              // silverlight bug:                //   supposed work setting windowstate.minimized.              //   if has borderless chrome, doesn't display when restored tray.              // work-around:                //   set windowstate.normal, , set window reduced monitor dimensions before minimizing.               //   restore tray using these dimensions.              if (application.current.isrunningoutofbrowser)              {                  application.current.mainwindow.windowstate = windowstate.normal;                    // dimensions monitor window on.                  win32rect mywin32rect = getmonitordimensions();                    // give windows top , left positions knows monitor on.                  // give monitor resolution -- monitor's height , width.                  window winz = application.current.mainwindow;                  winz.top = mywin32rect.top;                  winz.height = mywin32rect.bottom;                  winz.left = mywin32rect.left;                  winz.width = mywin32rect.right - mywin32rect.left;                    // shrink dimensions create 'normal' size.                  winz.height = winz.height - (0.30 * winz.height);                  winz.top = winz.top + (0.15 * winz.height);                  winz.left = winz.left + (0.15 * winz.left);                  winz.width = winz.width - (0.30 * winz.width);                    // minimize window                  application.current.mainwindow.windowstate = windowstate.minimized;              }          }            void maximizebutton_click(object sender, routedeventargs e)          {              if (application.current.isrunningoutofbrowser)              {                  if (application.current.mainwindow.windowstate == windowstate.maximized)                  {                      application.current.mainwindow.windowstate = windowstate.normal;                  }                  else                  {                      if (application.current.haselevatedpermissions)                      {                          // silverlight bug:                            //   window won't maximize on second monitor if borderless chrome.  window hidden.                          // work-around.                          //   setting windowstate.maximized causes problem.                          //   make work setting window monitor dimensions.                            // let windows think it's in maximized state,                          //    since we're going set dimensions maximize window.                          application.current.mainwindow.windowstate = windowstate.maximized;                            // dimensions monitor window on.                          win32rect mywin32rect = getmonitordimensions();                            // give windows top , left positions knows monitor on.                          // give monitor resolution -- monitor's height , width.                          window winz = application.current.mainwindow;                          winz.top = mywin32rect.top;                          winz.height = mywin32rect.bottom;                          winz.left = mywin32rect.left;                          winz.width = mywin32rect.right - mywin32rect.left;                      }                      else                      {                          messagebox.show("cannot maximize window without elevated permissions.");                      }                  }              }          }                    void closebutton_click(object sender, routedeventargs e)          {              if (application.current.isrunningoutofbrowser)                  application.current.mainwindow.close();          }            /// <summary>          /// dimensions monitor displaying left side of window.          /// </summary>          /// <returns></returns>          private win32rect getmonitordimensions()          {              // information windows of monitors.              displaymanager.displays.clear();              displaymanager.loaddisplays();                window winx = application.current.mainwindow;              win32rect mywin32rect = new win32rect();                // scan list of displays.                // dimensions of monitor contains left edge of window.              // application.current.mainwindow.left = left edge of window now.              foreach (displayinfo mydisplayinfo in displaymanager.displays)              {                  // if leftmost position of current window within dimensions                   // of monitor, dimensions of monitor.                  if (winx.left >= mydisplayinfo.monitorarea.left &&                       winx.left <= mydisplayinfo.monitorarea.right)                  {                      mywin32rect.top = mydisplayinfo.monitorarea.top;                      mywin32rect.bottom = mydisplayinfo.monitorarea.bottom;                      mywin32rect.left = mydisplayinfo.monitorarea.left;                      mywin32rect.right = mydisplayinfo.monitorarea.right;                  }              }              return mywin32rect;          }
using system;  using system.collections.objectmodel;  using system.net;  using system.runtime.interopservices;  using system.windows;  using system.windows.controls;  using system.windows.documents;  using system.windows.ink;  using system.windows.input;  using system.windows.media;  using system.windows.media.animation;  using system.windows.shapes;    // module created copying code post pete brown.  // http://10rem.net/blog/2012/02/07/creating-big-silverlight-windows-and-getting-monitor-resolutions-and-positions-with-pinvoke     namespace nw6viewmodel  {      [structlayout(layoutkind.sequential)]      public struct win32rect      {          public int left { get; set; }          public int top { get; set; }          public int right { get; set; }          public int bottom { get; set; }            public override string tostring()          {              return string.format("{0}, {1}, {2}, {3}", left, top, right, bottom);          }      }        [structlayout(layoutkind.sequential, charset = charset.auto)]      internal struct monitorinfoex      {          public int size;          public win32rect monitor;          public win32rect workarea;          public uint flags;          [marshalas(unmanagedtype.byvaltstr, sizeconst = displaymanager.devicenamecharactercount)]          public string devicename;            public void init()          {              this.size = 40 + 2 * displaymanager.devicenamecharactercount;              this.devicename = string.empty;          }      }        public class displayinfo      {          public string monitorname { get; internal set; }          public win32rect monitorarea { get; internal set; }          public win32rect workarea { get; internal set; }          public int width { get; internal set; }          public int height { get; internal set; }          public bool isprimary { get; internal set; }      }          /// <summary>      /// class used information of monitors attached pc.      /// </summary>      public class displaymanager      {          // size of device name string          internal const int devicenamecharactercount = 32;            private delegate bool monitorenumprocdelegate(intptr hmonitor, intptr hdcmonitor, ref win32rect lprcmonitor, uint dwdata);            [dllimport("user32.dll")]          private static extern bool enumdisplaymonitors(intptr hdc, intptr lprcclip, monitorenumprocdelegate lpfnenum, uint dwdata);            [dllimport("user32.dll", charset = charset.auto)]          private static extern bool getmonitorinfo(intptr hmonitor, ref monitorinfoex lpmi);            private static observablecollection<displayinfo> _displays = new observablecollection<displayinfo>();          public static observablecollection<displayinfo> displays          {              { return _displays; }          }              /// <summary>          /// information of monitors on pc.          /// copy displays observablecollection.          /// </summary>          public static void loaddisplays()          {              enumdisplaymonitors(intptr.zero, intptr.zero, monitorenumproc, 0);          }            [allowreversepinvokecalls]          internal static bool monitorenumproc(intptr hmonitor, intptr hdcmonitor, ref win32rect lprcmonitor, uint dwdata)          {              var monitor = new monitorinfoex();              monitor.init();                bool success = getmonitorinfo(hmonitor, ref monitor);                if (success)              {                  var display = new displayinfo();                    display.monitorname = monitor.devicename;                    display.width = monitor.monitor.right - monitor.monitor.left;                  display.height = monitor.monitor.bottom - monitor.monitor.top;                    display.monitorarea = monitor.monitor;                  display.workarea = monitor.workarea;                  display.isprimary = (monitor.flags > 0);                    _displays.add(display);              }                return true;          }      }  }  
if try this, let me know if has problems. also, how can improved?  or know of better workaround?

 

 


gary frank

it seems work fine me.  if try this, let me know if has problems. also, how can improved?  or know of better workaround?


gary frank



Silverlight  >  Programming Silverlight with .NET – General



Comments

Popular posts from this blog

Conditional formatting a graph vertical axis in SSRS 2012 charts

Register with Power BI failed

SQL server replication error Cannot find the dbo or user defined function........