Frage

Ich entwickle eine Karte Kontrolle in WPF mit C #. Ich verwende eine Leinwand Steuer z.B. 400 x 200, das einen Kartenbereich von beispielsweise zugewiesen 2,000m x 1,000m.

Der Maßstab der Karte wäre. canvas_size_in_meters / real_size_in_meters

Ich möchte die canvas_size_in_meters finden.

Die canvas.ActualWidth gibt die Breite in DIU des (Device Independant Units). Also, 400 DIU der ist 400/96 = 4,17 Zoll, WERDEN , dass die physischen Auflösung meines Monitors ist 96 dpi.

Allerdings mit einem Lineal, fand ich, dass die physikalische Auflösung meines Monitors 87 dpi. (Es gibt nur wenige Monitore, die TATSÄCHLICH 96 physikalische dpi haben)

Die DPI Unterschied (10%) entspricht einen + 10% Unterschied in der aktuellen Karte Steuerbreite auf dem Bildschirm.

Wie messe ich die Größe eines WPF-Steuerelement in Zoll GENAU und unabhängig von der Bildschirmauflösung und DPI-Einstellung?

War es hilfreich?

Lösung

  

Wie messe ich die Größe eines WPF-Steuerelement in Zoll GENAU und unabhängig von der Bildschirmauflösung und DPI-Einstellung?

Dies ist nicht wirklich möglich, weil für sie zu arbeiten, würde WPF die Auflösung wissen müssen (in Bezug auf DPI) des Monitors an. Klingt in der Theorie gut, aber in der Praxis Fenster nicht weiß, diese Informationen. Deshalb ist Windows selbst 96dpi immer davon ausgegangen, blind statt schlauer zu sein.

Selbst wenn es eine Möglichkeit, manuell es zu sagen, oder ob Ihr spezieller Monitor einen benutzerdefinierten Treiber hat, die die richtigen Informationen zu Fenster hindurchgeht, das wird nicht jemand anderes auf Arbeit des Computers, so dass Fenster nicht passieren diese Informationen auf alle Anwendungen.

Das Beste, was Sie tun können, ist eine Skala zeichnen wie Google Maps der Fall ist. Sie wissen, dass 1 Pixel == 1 Meile, so dass Sie eine 50-Pixel-Linie auf der Karte zeichnen können, mit einem Label sagen "diese Linie gleich 50 Meilen"

Andere Tipps

Es gibt Art und Weise aktuelle Pixelgröße in mm oder Zoll zu berechnen. Wie in den früheren Beiträgen erwähnte, ist es nicht ein fester Wert und in Abhängigkeit von der aktuellen Auflösung und Bildschirmgröße variieren würde.

Zuerst die aktuelle Auflösung. Angenommen, es ist 1280x1024 Jetzt erhalten Sie den Monitor Breite in mm GetDeviceCaps-Funktion. Es ist eine Standard-Windows-Library-Funktion.

int widthmm = GetDeviceCaps (Device, HORZSIZE); Mein Monitor Breite 362mm

So Pixelgröße = 362/1280 = 0,282 mm

Die Genauigkeit dieser Methode hängt von der Annahme, dass der Anzeigebereich genau die Breite des Monitors abdeckt.

So die ursprüngliche Frage zu beantworten, die Leinwandgröße von 400 x 200 Pixel wäre (400 * 0.282 / 1000) x (200 * 0.282 / 1000) in Metern, wenn auf dem Monitor angezeigt.

Vielen Dank für Ihre prompte Antwort.

Ich bin völlig einverstanden, aber ich wollte es nicht in erster Linie glauben. Sie sehen, hat es eine ungefähre Berechnung des Maßstabs der Karte, wenn die Karte verwendet wird, um verschiedene Schichten von Kartendaten (Skala abhängig) angezeigt werden soll. Die meisten Anwendungen verwenden, um einen Schieberegler mit z.B. 10 diskrete Karten-Stufen, die „scale“ einzustellen.

eine absolute Skala zu haben, ist nicht entscheidend für die Anwendung, wäre es schön, eine indikativ Skala angezeigt werden, wie 1: 15.000.

Ein absoluter Maßstab für eine zusätzliche Variable erfordern würde monitorPhysicalDPI (zunächst auf 96 gesetzt), dass, wenn die Verwendungen wählen etwas bessere Skalierung würde zu ändern (wieder es nicht entscheidend ist). Die Größe der Karte Kontrolle wäre:

map.ActualWidth * (96 / monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU ist 1/96

Auch hier sind diese Kosmetika .. Wäre es nicht schön, wenn Windows-die tatsächliche Kontrolle der Dimensionen hätte das gedacht? (Benutzer muss Informationen über die Bildschirmabmessungen auf OS-Setup geben oder einfach die Installation den Monitor INF-Datei)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top