Code Monkey home page Code Monkey logo

wpfmonitoraware's Introduction

WPF Monitor Aware Window

A library for WPF Per-Monitor DPI aware and color profile aware window

Overview

The introduction of Per-Monitor DPI for WPF is roughly divided into two phases:

  1. Per-Monitor DPI was first brought in Windows 8.1. It works with WPF but there is no built-in support for WPF.

  2. Built-in Per-Monitor DPI support for WPF was added in .NET Framework 4.6.2 on Windows 10 Anniversary Update (Redstone 1). It includes DpiScale struct which represents DPI scale information and relevant methods and events.

Reference:

New Phase

MonitorAware

Implementation after built-in support for WPF was added. It is designed to provide additional flexibilities for composing views under Per-Monitor DPI.

In the application manifest, DPI awareness must be specified:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <!-- Per Monitor V1 [OS >= Windows 8.1] 
         Values: False, True, Per-monitor, True/PM -->
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      true/PM</dpiAware>
    <!-- Per Monitor V1 [OS >= Windows 10 Anniversary Update (1607, 10.0.14393, Redstone 1)]
         Values: Unaware, System, PerMonitor -->
    <!-- Per Monitor V2 [OS >= Windows 10 Creators Update (1703, 10.0.15063, Redstone 2)]
         Value: PerMonitorV2 -->
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      PerMonitorV2, PerMonitor</dpiAwareness>
  </windowsSettings>
</application>

WpfMonitorAwareBehavior

Sample for implementation by Behavior.

WpfMonitorAwareProperty

Sample for implementation by attached property.

SlateElement

Components for DPI-aware window designed after Windows 10 style. It is required for MonitorAware to avoid inconsistent DPI scaling in non-client area but it works independently from MonitorAware.

WpfSlateWindow

Sample for SlateElement.

WpfExtendedWindow

Experimental DPI-aware window designed after Windows 8.1 style.

Old Phase

MonitorAware.Old

Original implementation before built-in support for WPF was added. It includes following 3 types:

Type Description
MonitorAwareWindow Per-Monitor DPI aware window.
MonitorAwareBehavior Behavior to make a window Per-Monitor DPI aware. This behavior is inherited from System.Windows.Interactivity.Behavior and so requires System.Windows.Interactivity.dll.
MonitorAwareProperty Attached property to make a window Per-Monitor DPI aware.

Properties:

Property Description
WindowHandler.IsPerMonitorDpiAware Whether current process is Per-Monitor DPI aware.
WindowHandler.SystemDpi System DPI. This value is used by default to render a Window and other FrameworkElements and so will be the starting point to adjust scaling of FrameworkElements that are once rendered.
WindowHandler.MonitorDpi Per-Monitor DPI of the monitor to which a Window belongs. This value will be updated when the Window receives WM_DPICHANGED message.
WindowHandler.WindowDpi Per-Monitor DPI to be used to render a Window. This value will be conformed to Per-Monitor DPI of the monitor when the Window moves to a location where the resized Window belongs to the destination monitor but not the source monitor. There will be a time lag between when WM_DPICHANGED message comes and when this value changes depending on the location of the Window.
WindowHandler.ColorProfilePath Color profile path used by the monitor to which a Window belongs.
WindowHandler.ForbearScaling Whether to forbear scaling.
WillForbearScalingIfUnnecessary Whether to forbear scaling if it is unnecessary because built-in scaling is enabled.

Events:

Event Description
WindowHandler.DpiChanged Occurs when the WindowDpi is conformed to the MonitorDpi.
WindowHandler.ColorProfileChanged Occurs when the ColorProfilePath is changed.

License

  • MIT License

wpfmonitoraware's People

Contributors

emoacht avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wpfmonitoraware's Issues

Dragging a maximised window

My app's main window has WindowState="Maximized" property set. When I grab it by the window title and start dragging for the first time, MonitorAware does not properly resize it. Here is the log from the debug output:

ENTERSIZEMOVE
SIZE
MOVE
MOVE
MOVE
MOVE
DPICHANGED: 96 -> 144
Monitor DPI: 96-96 -> 144-144
MOVE
MOVE
MOVE
MOVE
Window DPI: 96-96 -> 144-144
Old Size: 800-600
SIZE
SIZE
New Size: 2904-1211

What happens here (I think) is window gets un-maximised when I start dragging it (the first SIZE in the log) to 800-600 (I can confirm that this is the correct restored window size). Then, when I drag it into the monitor with a 1.5 DPI it incorrectly uses the maximised window's size rather then restored size: 800-600 * 1.5 should have been 1200-900, not the huge 2904-1211.

If I restore the window once before dragging it - the bug goes away.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.