Ich erhalte seltsames Aliasing-Verhalten in einer WPF-App mit dem ElementFlow-Steuerelement von FluidKit . Wir verwenden das Steuerelement in einer App bei der Arbeit, um Inhalte darzustellen, und wenn die Elemente von ElementFlow gekippt werden, werden die Kanten wie in der folgenden Abbildung angezeigt:
Um das Aliasing zu vermeiden, entschieden wir uns, den Neigungswinkel loszuwerden, also erstellte ich eine schnelle Test-App, bei der ich den Neigungswinkel, die Objektlücken und die Popout-Distanz zu den Slidern festlegte, um herauszufinden, was am besten aussah .
In der Test-App, die die gleichen Einstellungen verwendet, sind die Kanten jedoch schön geglättet:
Ich gehe davon aus, dass es irgendwo in der XAML-Hierarchie eine Einstellung gibt, die dies steuert, aber ich habe versucht, SnapsToDevicePixels
auf verschiedene Elemente und Stile einzustellen, sowohl zur Entwurfszeit als auch zur Laufzeit (mit Bindings und Tools wie Snoop) kein Erfolg.
Der XAML für das ElementFlow ist wie folgt:
%Vor%Ich habe auch beide Apps auf zwei verschiedenen Rechnern ausprobiert (eine unter XP Pro, eine XP Embedded, beide haben unterschiedliche Ebenen von dedizierten Grafiken) und beide zeigen Aliasing in der einen App und Anti-Aliasing in der anderen.
>Kennt jemand eine Einstellung oder ein XAML-Attribut, mit dem dies gesteuert werden kann?
Wenn ich mich richtig erinnere, dass es in WPF 3.5 einen Fehler bezüglich Aliasing in diesem Szenario gibt, kann ich nicht die relevanten Informationen finden, aber von dem, was ich weiß, war ein DirectX-Flag nicht gesetzt richtig von WPF.
Ich erinnere mich, dass ich festgestellt habe, dass das Problem durch das Umbrechen des betreffenden Elementes in bestimmte Arten von Elternelementen behoben wurde. Zum Beispiel, ich denke, das Verursachen des beleidigenden Elementes in einer leeren Grenze behebt das Problem? Wiederum kann ich nicht für das Leben von mir die Information wieder finden, aber wenn ich es finde, werde ich meine Antwort aktualisieren.
Ich nehme an, dass die Unterschiede, die Sie zwischen den Anwendungen sehen, damit zusammenhängen. In der App, die Aliasing zeigen, sind die Elemente in der ItemTemplate in eine Art von Elternelement eingewickelt (wo sind sie als Test-App nicht)? Oder umgekehrt?
Tut mir leid, ich kann nicht mehr helfen, suche immer noch nach Informationen, aber meine Google-Befugnisse scheinen heute schwach zu sein.
UPDATE: Ok, ich habe gefunden, woran ich gedacht habe.
Das hängt mit Effekten zusammen, also ist das vielleicht nicht dasselbe, was Sie sehen, aber es ist einen Versuch wert.
Eine Sache ist die Position des ElementFlow-Steuerelements. Wenn es sich nicht um ein ganzes Pixel handelt, kann das alles wegwerfen. SnapToDevicePixels wird nicht mit dem Arrangierrekt helfen.
Dies passiert im Allgemeinen, wenn Sie TextBlocks verwenden, da ihre Höhen / Breiten im Allgemeinen keine ganzen Zahlen sind.
In .NET 4 gibt es ein neues FrameworkElement.UseLayoutRounding das behebt dieses Problem.
Dies ist ein häufiges Problem von WPF 3D. FluidKits ElementFlow verwendet WPF 3D. Die Elemente im Steuerelement sind echte 3D-Objekte (Viewport3D, ContainerUIElement3D). Subpixel-Rendering-Probleme, LayoutRounding und SnapToDevicePixels gelten nicht für 3D-Inhalte. Wenn die Leistung nicht stimmt, wird WPF auf Alias-Viewport3D-Inhalt zurückgesetzt. Die meisten Ihrer problematischen App verbraucht also zu viel Ressourcen (CPU, GPU, Speicher). Ich habe die Erfahrung gemacht, dass dies viel häufiger unter Windows XP als unter Vista / Windows 7 passiert. Für Windows XP hilft es ein bisschen, die Antialias-Registrierungsschlüssel . Abgesehen davon und zur Verbesserung der Leistung Ihrer App können Sie nicht viel mehr tun.
Brendan Clark von MSFT sagt:
Fehler wie diese treten auf, wenn Sie es versuchen Zeichne Inhalte an Subpixelpositionen. Wenn Sie versuchen, eine Linie auf a zu zeichnen Halb Pixel Grenze, wird WPF normalerweise Anti-Alias die Linie, um es zu überblenden beide Pixel enthalten es (die bewirkt, dass es weniger scharf wird, heller oder "verschwommen"). Wenn Sie erzwingen Alias-Rendering, Linien auf Subpixel Grenzen werden manchmal gezogen vollständig innerhalb eines Pixels; anderen Zeiten die Rundung wird so funktionieren sie verschwinden.
Haben Sie versucht, verschiedene Werte für ElementHeight festzulegen?
Tags und Links wpf .net antialiasing