2016-03-23 45 views
7

ustawień moje okna są ustawione mieć DPI 96. Jednak gdy tworzę następujące Window będzie trochę mniejszy niż mojego ekranu (który jest ustawiony na rozdzielczość 1920 * 1080):Dlaczego urządzenia niezależne od urządzenia są 1920 r., A nie 1920 pikseli i 96 DPI?

<Window x:Class="WPF_Sandbox.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:WPF_Sandbox" 
     mc:Ignorable="d" 
     Title="MainWindow" 
     Width="1920"> 
</Window> 

Według do this msdn wpis na blogu:

1 niezależne urządzenie piksel = 1/96 cala.
1 fizyczny piksel = 1/DPI (w zależności od systemu DPI)

Domyślne ustawienia systemowe zwykle wybierają DPI 96, więc te dwa rodzaje pikseli mają taki sam rozmiar.

Nie wydaje się, aby tak było, ponieważ mój Window ma wyraźnie mniej niż 1920 pikseli szerokości.
Jeśli zmaksymalizować wartość Window i sprawdzić jej ActualWidth, wygląda na to, że jest to 1936.

Dlaczego tak się dzieje?

Odpowiedz

3

Pytanie jest bardziej wzdłuż linii:

Dlaczego Window.ActualWidth zgłosić szerokość, która nie wydaje się być „prawdziwe” szerokość okna?

Odpowiedź jest taka, że ​​co wygląda pełną szerokość okna nie jest dokładnie pełny szerokość.

Po ustawieniu Width, kwerendy ActualWidth lub nawet użyć GetWindowRect aby uzyskać „no-leży, co robi, że moje okna szerokość”, jesteś ustawienie lub uzyskiwanie szerokość okna łącznie niewidocznych częściach .

Te niewidoczne części, zwłaszcza w systemie Windows 10, zawiera trochę dodatkowego miejsca dla co ułatwia użytkownikom zmianę rozmiaru okna, nawet jeśli są one nieco od granicy:

resize off of the window

(zauważ, że moja mysz nie jest na granicy, ale raczej nieco na prawo)

oznacza to, że kiedy zmaksymalizować okno, twój szerokość jest nadal „usztywniony” z tej niewidzialnej przestrzeni, a więc Twoje okno rozmiar będzie większy niż rozmiar ekranu.

Jak uzyskać szerokość dodatkowej przestrzeni? GetSystemMetrics z SM_CXSIZEFRAME i SM_CXPADDEDBORDER jest Twój przyjaciel tutaj (przykład zawiera kod z pinvoke.net):

int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME) 
         + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER); 
double realWidthForSure = ActualWidth - borderSize * 2; 

Jeśli następnie zmaksymalizować okno, należy zauważyć, że realWidthForSure powinna być równa swój 1920px, że można się spodziewać.

+0

W zasadzie, kiedy zmaksymalizuję "Okno", będzie ono większe niż ekran (dlatego "Szerokość" to "1936") z powodu niewidzialnej granicy. Mam cię. –

+0

@TimPohlmann tak; dodał nieco więcej do odpowiedzi, aby to stwierdzić. – FriendlyGuy

-1

Jakie są twoje specyfikacje ekranu? na przykład mój monitor ma skok = 0,282 mm; co równa się 90.0709 ... ppi. Okno o szerokości 1920 pikseli miało rzeczywistą szerokość 2046 jednostek w WPF.

określić DPI ekranu za skok (25,4/jeśli masz skok w mm)

96/DPI * 1920 => rzeczywista szerokość

+0

W jaki sposób WPF zna fizyczne DPI mojego monitora? Według połączonego posta na blogu używa on systemu DPI systemu Windows, który jest ustawiony na 96. –

3

Okno naprawdę ma szerokość 1936 pikseli!

Gdy okno jest zmaksymalizowane, obramowanie wokół niego jest przycinane. Chociaż nie jest już widoczny, nadal jest uważany za część okna. W motywu Aero, granica ta ma szerokość 8 pikseli z każdej strony, stąd 16px dodatkowo:

Window chrome in Aero theme

Jeśli przełączyć do klasycznego tematu, to tylko 4px z każdej strony, więc okno będzie 1928 pikseli szerokości.

+0

Ale mój ekran ma tylko 1920 pikseli. –

+0

Okno jest szersze niż ekran. –

+0

Ale tak nie jest. Po obu stronach jest miejsce. –