6

WPFでさまざまな色の長方形をシームレスに並べて表示したいと思います。つまり、長方形の束を端から端まで配置し、それらの間にギャップがないようにします。

すべてがピクセルに揃えられている場合、これは正常に機能します。ただし、任意のズームもサポートしたいので、理想的には、SnapsToDevicePixelsを使用したくありません(画像をズームアウトすると品質が低下するため)。しかし、それは私の長方形が時々ギャップでレンダリングされることを意味します。例えば:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Background="Black">
  <Canvas SnapsToDevicePixels="False">
    <Canvas.RenderTransform>
      <ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
    </Canvas.RenderTransform>
    <Rectangle Canvas.Left="25" Width="100" Height="100" Fill="#CFC"/>
    <Rectangle Canvas.Left="125" Width="100" Height="100" Fill="#CCF"/>
  </Canvas>
</Page>

ScaleTransformのScaleXが1の場合、長方形はシームレスに結合します。0.5になると、それらの間に濃い灰色の縞があります。理由を理解しています-結合された半透明のエッジピクセルは、100%不透明になるように結合されません。しかし、私はそれを修正する方法が欲しいです。

長方形をオーバーラップさせることはいつでもできますが、どのパターンになるかを事前に知ることはできません(これは、最終的にマップエディターをサポートするゲーム用です)。さらに、これにより、ズームインしたときにオーバーラップ領域の周りにアーティファクトが発生します(アンダーラップ部分で斜角をカットした場合を除きます。これは非常に多くの作業であり、コーナーで問題が発生します)。

これらの長方形を組み合わせて、内部ギャップなしでレンダリングする単一の結合された「形状」にする方法はありますか?私はGeometryDrawingをいじってみましたが、これはまさにそれを実行しますが、各RectangleGeometryを異なる色のブラシでペイントする方法がわかりません。

SnapsToDevicePixelsを使用せずに、任意の変換の下で図形をシームレスに並べて表示する他の方法はありますか?

4

2 に答える 2

2

ガイドライン( MSDNのGuidelineSetを参照)を使用し、RectanglesのOnRenderメソッドをオーバーライドして、それらの境界がデバイスのピクセル境界と一致するようにすることを検討してください。WPFはガイドラインを使用して、図面をスナップするかどうか、およびスナップする場所を決定します。

内部的には、SnapsToDevicePixelsがオブジェクトをデバイスのピクセルと整列させるために使用しているものですが、ガイドラインを手動で配置することで、スナップ動作が適用されるタイミングと適用されないタイミング(つまり、画像がすべてズームされたとき)を制御できます。途中で、ガイドラインの描画を回避するか、シェイプが他のシェイプの隣にあるガイドラインのみを描画し、残りはWPFのアンチエイリアシングに依存することができます)。アタッチされたプロパティを使用してそれを実行し、任意の要素に適用できる場合がありますが、この動作が必要な要素のタイプが1つだけの場合(Rectangleなど)、余分な労力を費やす価値はないでしょう

Microsoftもこの問題を認識しているようです。WPF4.0はレイアウト丸めを備えていると予想されます。これはSilverlightのバージョンと同様に、レイアウト丸めが有効になっている場合、レンダーパスで非整数値を丸めます。

于 2009-06-07T20:52:16.627 に答える
0

ギャップは実際のギャップではなく、ペイントされたストロークだと思います。縮小すると、ストロークが見えなくなるほど小さくなります。どのスケールでも問題なく動作する長方形の色でストロークをペイントしようとしました。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      背景="黒">
  <Canvas SnapsToDevicePixels="False">
    <Canvas.RenderTransform>
      <ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
    </Canvas.RenderTransform>
    <Rectangle Canvas.Left="25" Width="100" Height="100" Fill="#CFC" Stroke="#CFC"/>
    <Rectangle Canvas.Left="125" Width="100" Height="100" Fill="#CCF" Stroke="#CCF"/>
  </キャンバス>
</ページ>
于 2012-11-21T10:07:04.327 に答える