4 Stimmen

FlowDocument verliert ClearType in untergeordneten Elementen, wenn es in einem Fenster mit benutzerdefiniertem Glas platziert wird

Also die neue WPF 4 Text-Rendering sieht gut aus, aber die Aktivierung der Aero-Glas-Effekt auf ein Fenster erfordert, dass Sie den Hintergrund zu transparent, die natürlich deaktiviert ClearType Rendering ändern.

Mit dem mitgelieferten RenderOptions.ClearTypeHint=Enabled können Sie untergeordnete Elemente bestimmen, um das ClearType-Rendering ab diesem Punkt im Baum wieder zu aktivieren. Ich habe ein paar andere Themen gefunden, die darüber sprechen, dies für den ScrollViewer zu tun, der intern in RichTextBox und FlowDocumentScrollViewer verwendet wird, und das Erstellen eines benutzerdefinierten Stils behebt es tatsächlich, sodass mein FlowDocument wieder ClearType-Rendering erhält.

Dies gilt jedoch nur für Absätze der obersten Ebene im FlowDocument. Wenn ich Unterteilungen, Abbildungen oder eine Tabelle hinzufüge, wird der Text darin unerklärlicherweise wieder in Graustufen dargestellt. Ich weiß, dass der Glaseffekt daran schuld ist, denn wenn ich ihn deaktiviere, wird das ClearType-Rendering wieder aktiviert.

Ich habe mir den visuellen Baum mit Snoop angesehen, aber sowohl der Hauptinhalt (der korrekt gerendert wird) als auch der Unterinhalt (der in Graustufen dargestellt wird) haben ähnliche Elementhierarchien ohne etwas, dem ich RenderOptions.ClearTypeHint zuordnen kann.

Ist jemand auf dieses Problem gestoßen? Gibt es eine Umgehung oder eine Lösung? Ich habe bei Connect nachgesehen, aber es wurde kein Fehler zu diesem Problem gefunden. Das ist ein ziemlich ärgerliches Problem.

2voto

MikeP Punkte 7602

Nachdem ich viel mehr recherchiert und die Funktionsweise verschiedener Steuerelemente mit und ohne Aero Glass verglichen habe, habe ich einige Antworten gefunden. Das TextBox-Steuerelement funktioniert nicht richtig entweder, aber Teile von FlowDocument und Dinge wie TextBlock tun, die mich aufgefordert, zu erkunden, warum.

Nachdem ich eine Weile in Reflektor herumgegraben habe, fand ich heraus, dass bei der Verwendung der erweiterten Textformatierungs-APIs, um Text zu erhalten und ihn auf einen Zeichnungskontext zu rendern, die RenderOption-Flags im Wesentlichen ignoriert werden, da das Zeichnungssystem vom Root-Visual (dem Fenster) weiß, dass Transparenz aktiviert wurde. Sobald das passiert, sind alle RenderOptions-Flags in der Welt nicht gehen, um ClearType zurück zu bekommen.

Ich bin allerdings über eine Lösung gestolpert. Wenn Sie Zugriff auf den DrawingContext haben und das Low-Level-Text-Rendering selbst durchführen, können Sie ein DrawRectangle hinter dem Text mit einer Füllung ausführen, und ClearType wird wieder aktiviert. Ich nehme an, dass dies die einzige Möglichkeit für den Renderer, um sicher zu sein, dass es einen richtigen Hintergrund zu zeichnen auf hat.

Zusammenfassend lässt sich also sagen, dass Sie Ihren Text selbst zeichnen müssen, und zusätzlich müssen Sie explizit einen Hintergrund mit demselben DrawingContext hinter Ihrem Text zeichnen, damit ClearType richtig gerendert wird.

0voto

Markus Hütter Punkte 7647

Ich weiß, das könnte mühsam werden, aber haben Sie versucht, allgemeine Stile wie folgt einzustellen:

    <Style TargetType="Paragraph">
        <Setter Property="RenderOptions.ClearTypeHint" Value="Enabled"/>
    </Style>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X