Laden...

[gelöst] WPF - Element im Grid zusammengebaut, in der Anzeige sind aber Lücken

Erstellt von Jéré vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.545 Views
Jéré Themenstarter:in
151 Beiträge seit 2009
vor 13 Jahren
[gelöst] WPF - Element im Grid zusammengebaut, in der Anzeige sind aber Lücken

Hallo

Ich möchte gern versuchen die Ursachen des folgendem Phänomen zu beseitigen. Vielleicht kennt der eine oder andere schon die Lösung dazu.
In einem Grid ist der Background eines Button-Controls aufgeteilt. Quasi wie eine Matrix:

x x x
x x x
x x x

Die Elemente (außer das in der Mitte) haben eine feste Größe. Jede Zelle fülle ich mit einem Rectangle und diese haben natürlich keine Border. Wenn ich mir das Control alleine anschaue, ist alles gleichmäßig (ohne Lücken) gefüllt.
Wenn das Control nun eingebaut wird, sieht man zwischen den Rectangles feine Linien, die nicht gefüllt sind, also kleine Lücken.
Woher kommt das?

Grüßle
Jéré

S
506 Beiträge seit 2006
vor 13 Jahren

hast du mal explizit die Breite und Höhe aller Spalten gesetzt?

Wie sieht es mit Margins und Paddings der Grideinträge, sowie des Grids aus?

Jéré Themenstarter:in
151 Beiträge seit 2009
vor 13 Jahren

Hallo Stu42,

ich habe die Zellen alle mal explizit gesetzt, jedoch ohne Änderung in der Anzeige. Die Elemente im Grid (alles Rectangles) haben keine Padding und das Margin ist überall auf 0. Das Grid selbst hat ebenso kein Padding und Margin ist bei 0.

Ich hatte gehofft, dass es da irgendeine Einstellung gibt, die das vielleicht bewirkt.

Dieses Phänomen besteht sogar bei Unterschiedlichen Größen des Controls auf unterschiedlicher Weise. Mal sind die Lücken rechts und links größer (bei einem querformatigem Control) und mal sind oben und unten größere Lücken (hochformatiges Control).
Danke für deine Ideen.

Grüßle
Jéré

S
506 Beiträge seit 2006
vor 13 Jahren

Wenn die Lücken nur klein sind, z.B. 1-3 pixel, könnte es auch noch an "SnapToDevicePixel" und/oder "UserLayoutRounding" liegen.

Jéré Themenstarter:in
151 Beiträge seit 2009
vor 13 Jahren

Hallo Stu42,
Die Lücken sind nur sehr klein (vllt 1px). Wenn ich die Margin auf minus irgendwas setze sind die Lücken nicht mehr da, aber durch die Transparenz im Control tritt eine Überlagerung auf, die nicht sein darf.
"SnapToDevicePixel" zeigt keine Auswirkung. Die Eigenschaft "UseLayoutRounding" kann ich nicht setzen. Darauf kann nicht zugegriffen werden. Dabei hab ich das so wie in dem Beispiel hier gemacht.

Grüßle
Jéré

S
506 Beiträge seit 2006
vor 13 Jahren

Das UseLayoutRounding gibt es erst mit .NET 4.

Aber das Problem hörst sich für mich stark nach "SnapToDevicePixel" an. Bist du dir sicher
das es nicht vieleicht für eines der Child´s gesetzt ist?

Vieleicht einfach mal anstelle deines Controls, Border´s einsetzen, um zu schauen ob es immer noch so ist.

L
862 Beiträge seit 2006
vor 13 Jahren

Das Problem ist mir bekannt. Setze SnapToDevicePixels auf True und deaktiviere das Antialiasing. Dann sollten keine Lücken entstehen (solange du das Control nicht drehen willst)

So deaktivierst du AAing:


RenderOptions.SetEdgeMode(control, EdgeMode.Aliased);

Geht natürlich auch in XAML!

Jéré Themenstarter:in
151 Beiträge seit 2009
vor 13 Jahren

Hallo Lector,

danke für diesen Hinweis. Damit habe ich es hinbekommen.

Ein Zusatz von mir folgt allerdings. Ich habe gerade die Erfahrung gemacht, dass die Anzahl der Pixel insgesamt eine Rolle spielen. In meinem Beispiel konnte ich ohne Anpassung der Pixel nur einen Teilerfolg mit dem genannten Lösungsweg erreichen. Und zwar bei allen Controls, die eine gerade Anzahl von Pixeln in der Höhe und in der Breite hatten.

Am Beispiel:
Mein Control bestand aus 10px obere Reihe *px mitte und 10px untere Reihe. Insgesamt war bei dem Control, bei dem keine Besserung erreicht wurde, eine Gesamtgröße von 75px angegeben. Als ich die Gesamtgröße auf 80px erhöhte war der gewünschte Erfolg da.
Daraus schliesse ich, dass die 55px nicht genau aufgeteilt wurden und durch Rundung beim Rendering der Baustein des Controls (mitte) etwas (1px) nach oben gerutscht ist. Nach Änderung war die Anzahl der Pixel in der Mitte bei 60 und damit konnte die Position genau eingehalten werden.

Damit hat sich das Problem erledigt und ich danke euch beiden für eure Hilfe!

Grüßle
Jéré

L
862 Beiträge seit 2006
vor 13 Jahren

Gut zu wissen.

Ich würde an deiner Stelle allerdings mal versuchen die DPI deines PCs zu verändern und es erneut auszuprobieren. Die Einheiten die du in WPF angibst sind nämlich keine Pixel sondern 1/96 inch. Bei dem Standard-DPI-Wert von 96 ergibt das tatsächlich genau ein Pixel. Ich wäre mit solchen Annahmen allerdings vorsichtig. Bei einem Windows7-Notebook mit hoher Bildschirmauflösung kann es schon mal vorkommen dass der initiale DPI-Wert auf 120 steht ohne dass der Benutzer diesen explizit eingestellt hat was natürlich auch Sinn macht da Schriften auf einem Full-HD 15''-Monitor nicht mehr so leicht zu erkennen sind.

Es wäre interressant wenn du das Ergebnis hier posten könntest solltest du es ausprobieren. Die Tatsache dass die Größe deiner Controls bestimmt ob ein Freiraum zu sehen ist oder nicht zeigt dass da bestimmt noch irgendein Rundungsproblem (in der WPF) besteht.

Jéré Themenstarter:in
151 Beiträge seit 2009
vor 13 Jahren

Hallo Lector,

ich habe mal unter dem DPI Wert von 120 die Anwendung laufen lassen. Dabei wird bei gerader und ungerader Pixelzahl keine Lücke angezeigt. Ich nehme jetzt mal keine Umrechnung der Pixelzahlen in den höheren DPI Wert vor.
Es bleibt wohl dabei, dass da ein Rundungsfehler vorliegen könnte.

Dauerhaft werde ich allerdings bei meinem 24" Monitor keinen 120er DPI Wert nehmen 😉

Grüßle
Jéré