9

FluidKit のElementFlow コントロールを使用して、WPF アプリで奇妙なエイリアシング動作が発生します。コンテンツを表示するために作業中のアプリでコントロールを使用しています。ElementFlow の要素が傾いていると、次の画像のようにエッジがエイリアスになります。 エイリアス エッジ

エイリアシングを回避するために、傾斜角を取り除くことにしたので、傾斜角、アイテムのギャップ、およびポップアウト距離をスライダーにバインドする簡単なテスト アプリを作成して、最適に見えるものを見つけました。

ただし、同じ設定を使用したテスト アプリでは、エッジが適切にアンチエイリアスされています。 エッジのアンチエイリアス

これを制御している XAML 階層のどこかに設定があると想定していますがSnapsToDevicePixels、設計時と実行時の両方で (Snoop などのバインディングとツールを使用して) さまざまな要素とスタイルを設定しようとしましたが、役に立ちませんでした。

ElementFlow の XAML は次のとおりです。

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <Fluid:ElementFlow
            x:Name="ContentElementFlow"
            SelectedIndex="{Binding SelectedIndex}"
            Focusable="True"
            TiltAngle="15.95"
            ItemGap="0.722"
            FrontItemGap="0.052"
            PopoutDistance="1.631"
            HasReflection="False"
            Background="Transparent"
            CurrentView="{StaticResource CoverFlowView}"
            ElementWidth="175"
            ElementHeight="250"
            >
            <Fluid:ElementFlow.Camera>
                <PerspectiveCamera
                    FieldOfView="60"
                    Position="0,0,6"
                    LookDirection="0,0,-6"
                    UpDirection="0,1,0"
                    />
            </Fluid:ElementFlow.Camera>
        </Fluid:ElementFlow>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

また、2 つの異なるマシン (1 つは XP Pro を実行し、もう 1 つは XP Embedded を実行し、どちらも専用グラフィックスのレベルが異なります) で両方のアプリを試してみました。

これを制御するために使用できる設定または XAML 属性を知っている人はいますか?

4

4 に答える 4

1

これは、WPF3Dの一般的な問題です。FluidKitのElementFlowはWPF3Dを使用します。コントロール内のアイテムは、実際の3Dオブジェクト(Viewport3D、ContainerUIElement3D)です。サブピクセルレンダリングの問題、LayoutRoundingおよびSnapToDevicePixelsは3Dコンテンツには適用されません。パフォーマンスが適切でない場合、WPFはエイリアス化されたViewport3Dコンテンツに戻ります。そのため、問題のあるアプリが大量のリソース(CPU、GPU、メモリ)を消費している可能性があります。私は、これがVista / Windows7よりもWindowsXPではるかに頻繁に発生することを経験しました。WindowsXPの場合、アンチエイリアスレジストリキーを設定するのに少し役立ちます。それ以外に、アプリのパフォーマンスを向上させる以外に、それについてできることはそれほど多くありません。

于 2010-08-21T05:11:26.230 に答える
1

私の記憶が正しければ、このシナリオのエイリアシングに関して WPF 3.5 にバグがあり、関連する情報を見つけることはできませんが、私が覚えている限りでは、WPF によって正しく設定されていない Direct X フラグでした。 .

問題のある要素を特定の種類の親要素でラップすると、問題が解決するように見えたことを覚えています。たとえば、問題のある要素を空の境界線で囲むと問題が解決すると思いますか? 繰り返しますが、一生情報を見つけることはできませんが、見つけたら回答を更新します。

アプリケーション間で見られる違いは、これに関連していると思います。エイリアシングを示すアプリでは、ある種の親要素にラップされた ItemTemplate の項目があります(テストアプリではそうではありません)? それともその逆?

申し訳ありませんが、これ以上お役に立てず、引き続き情報を探していますが、今日は私の Google パワーが弱くなっているようです。

更新:わかりました、私が考えていたものを見つけました。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7382637b-b4bc-4a46-8bed-f36250a65385/

これはエフェクトに関連していたので、これはあなたが見ているものと同じではないかもしれませんが、一見の価値があります.

于 2010-08-19T18:41:28.090 に答える
1

考慮すべき点の 1 つは、ElementFlow コントロールの場所です。配列 rect がピクセル全体にない場合、すべてが失われる可能性があります。SnapToDevicePixels は、配列長方形には役立ちません。

TextBlocks の高さ/幅は一般に整数ではないため、これは一般に TextBlocks を使用するときに発生します。

.NET 4 には、この問題を修正する新しいFrameworkElement.UseLayoutRoundingがあります。

于 2010-08-20T13:04:11.950 に答える
0

MSFT の Brendan Clark は次のように述べています。

サブピクセルの位置にコンテンツを描画しようとすると、このようなエラーが発生します。ハーフ ピクセル境界に線を描画しようとすると、通常、WPF は線をアンチエイリアス処理して、それを含む両方のピクセルにブレンドします (これにより、シャープさが失われたり、明るくなったり、「ぼやけたり」します)。エイリアス レンダリングを強制すると、サブピクセル境界上の線が完全にピクセル内に描画されることがあります。それ以外の場合は、丸めがうまくいき、それらが消えます。

ElementHeight に別の値を設定しようとしましたか?

于 2010-08-18T16:39:23.260 に答える