6

このテンプレートとWPF/XAMLのスタイルのグリッドがあります。

<Setter Property="TextOptions.TextFormattingMode" Value="Display" />
<Setter Property="RenderOptions.ClearTypeHint" Value="Enabled" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type DataGridCell}">
            <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                <ContentPresenter x:Name="CellContent" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RenderOptions.ClearTypeHint="Enabled" />
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter TargetName="CellContent" Property="TextOptions.TextFormattingMode" Value="Display" />
                    <Setter TargetName="CellContent" Property="RenderOptions.ClearTypeHint" Value="Enabled" />
                    <Setter TargetName="CellContent" Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect ShadowDepth="2" BlurRadius="2" Color="Black" RenderingBias="Quality" />
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

DropShadowEffectグリッド行を選択すると、テキストのレンダリングがぼやけるように見えます(灰色のアンチエイリアシング)。

ここに画像の説明を入力してください

ドロップシャドウ効果を削除すると、灰色のサブピクセルアンチエイリアシングではなくClearTypeが使用されるようになったため、はっきりと見えます。

ここに画像の説明を入力してください

上記のように適用RenderOptions.ClearTypeHint="Enabled"してContentPresenterみましたが、効果がありません。

ドロップシャドウ効果で表示されるテキストを強制的にレンダリングして、醜いぼやけた灰色のサブピクセルアンチエイリアシングではなく、Cleartypeアンチエイリアシングを保持するにはどうすればよいですか?

ドロップシャドウが原因でぼやけていると考える人もいますが、これは正しくありません。ClearTypeが使用されていないため、ぼやけています。これは、シャドウとClearTypeを使用したFirefoxでの外観です。

ここに画像の説明を入力してください

ClearType対応のテキストはカラフルですが、ClearTypeを使用していないため、ぼやけたテキストはそうではありません。灰色のサブピクセルアンチエイリアシングを使用しており、ClearTypeの動作とは異なります。http://en.wikipedia.org/wiki/ ClearType

問題は、このテキストに対してClearTypeを有効にするにはどうすればよいですか?

4

6 に答える 6

12

と同様に設定しTextOptions.TextFormattingModeてみませんか?後者はWPF3.5SP1の新機能であり、私は通常、これを使用してぼやけを取り除きます。:)DisplayRenderOptions.BitmapScalingModeNearestNeighbor

<TextBlock Text="Hello world" TextOptions.TextFormattingMode="Display"
           RenderOptions.BitmapScalingMode="NearestNeighbor"
           HorizontalAlignment="Center" TextWrapping="Wrap"
           VerticalAlignment="Center" Foreground="White" FontFamily="Microsoft Sans Serif">
    <TextBlock.Effect>
        <DropShadowEffect ShadowDepth="2" BlurRadius="2" Color="Black"
                          RenderingBias="Quality"/>
    </TextBlock.Effect>
</TextBlock>

以下はその様子です。

ここに画像の説明を入力してください

そして、これはFireFoxでどのように見えるかです。

ここに画像の説明を入力してください

于 2012-04-21T14:17:18.190 に答える
5

DropShadowEffectオブジェクトはClearTypeでは機能しません。これは、MSDNページに記載されています。方法:影付きのテキストを作成する

これらのシャドウ効果は、Windows Presentation Foundation(WPF)のテキストレンダリングパイプラインを通過しません。その結果、これらのエフェクトを使用する場合、ClearTypeは無効になります。

結局のところ、DropShadowEffectはビットマップ効果であり、テキスト効果ではありません。

于 2012-04-15T11:24:58.790 に答える
3

2つのアイデアを組み合わせるのはどうですか。DropShadowEffectを使用してテキストを描画し、ここの3行目に示すように、効果なしで描画された同じテキストをオーバーレイします。

文章

まだ完璧ではなく、少し大胆だと思います。しかし、おそらくあなたが一緒に暮らすことができる何か。XAML:

<StackPanel Background="LightSteelBlue" RenderOptions.ClearTypeHint="Enabled" SnapsToDevicePixels="True" >
    <Grid Margin="5">
        <TextBlock Foreground="Black" Text="Here is some sample text" Margin="1"/>
        <TextBlock Foreground="White" Text="Here is some sample text"/>
    </Grid>
    <TextBlock Margin="5" Foreground="White" Text="Here is some sample text">
        <TextBlock.Effect>
            <DropShadowEffect ShadowDepth="2" BlurRadius="2" Color="Black" RenderingBias="Quality"/>
        </TextBlock.Effect>
    </TextBlock>
    <Grid Margin="5">
        <TextBlock Foreground="White" Text="Here is some sample text">
            <TextBlock.Effect>
                <DropShadowEffect ShadowDepth="2" BlurRadius="2" Color="Black" RenderingBias="Quality"/>
            </TextBlock.Effect>
        </TextBlock>
        <TextBlock Foreground="White" Text="Here is some sample text"/>
    </Grid>
</StackPanel>
于 2012-04-19T20:49:27.087 に答える
3

エフェクトを使用せずに同様の結果を得るには、テキストを2回レンダリングし、1回は他のテキストからわずかにオフセットします。

<Grid>
    <TextBlock Text="Here is some sample text" Foreground="Black" Margin="1,1,0,0"/>
    <TextBlock Text="Here is some sample text" Foreground="White"/>
</Grid>

これにより、目的の結果が得られます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これをコントロール(おそらくと呼ばれる)にカプセル化して、ShadowTextBlockどこでも繰り返す必要がないようにすることもできます。

于 2012-04-15T16:25:14.633 に答える
2

これが機能しない理由、および機能させることができない理由は、ClearTypeが上にレンダリングされているものに対する感度に関係しています。ClearTypeが正しく表示されるようにするには、基本的にコンポーネントごとのアルファブレンディングを実行する必要があります。つまり、赤、緑、青の個別のアルファ値です(通常、アルファは3つすべてに適用されます)。これが意味するのは、ClearTypeは絶対に不透明なビットマップにレンダリングする必要があるということです(すべてのアルファ値は255です)(ウィンドウのタイトルバーにはまだClearTypeがありますが、これを行うにはいくつかの極秘のトリックが使用されます)。

これを理解するための次のステップは、WPF効果が最初に画面外のビットマップにレンダリングされ、次にその下にあるもの(この場合は白一色、または選択されている場合は青)と組み合わされることです。

そのため、テキストは最初にクリアで透明なビットマップにレンダリングされます。最終的にその下に何が表示されるかわからないため、ClearTypeの代わりにグレースケールを使用してレンダリングする必要があります。次に、エフェクトがそのビットマップに適用されます。次に、ビットマップは画面上の期待どおりの場所に描画され、透明度のない単色の上にある場合でもClearTypeを取得する可能性はありません。

考えられる回避策として、テキストの2つのコピーを使用してみてください。まず、効果をテキストの「低い」バージョンに適用します(「低い」とは、Zインデックス値を低くする必要があることを意味します。これは、XAMLで「最初」の場合です)。次に、その上に通常のテキストを描画します(ClearTypeを取得します)。これはうまくいくと思いますが、私は試していません。希望する視覚的な結果が得られるまで、おそらく実験する必要があります。

于 2012-04-25T21:05:55.370 に答える
1

この投稿が古いことは知っていますが、テキストがぼやけている場合は、境界線のドロップシャドウが原因である可能性があります。ドロップシャドウ付きのカスタムパネルがあり、パネルを並べて配置した場合にのみテキストがぼやけていました。私はこれから答えを見つけましたなぜWPFのすべてがぼやけているのですか?役職。私にとっての解決策は、受け入れられた答えではなく、ecreifの答えでした。これをコントロールに追加します

    UseLayoutRounding="True"
    RenderOptions.BitmapScalingMode="NearestNeighbor"
    SnapsToDevicePixels="True
    RenderOptions.ClearTypeHint="Enabled"
于 2019-07-12T16:24:58.823 に答える