本当に矛盾はありません...何が起こっているのかというと、あなたは本当に小さくレンダリングするものを取っているということです(あなたの道は非常に小さいです):
小さな箱を見てください
...そしてそれを非常に大きくスケールアップし、レイアウトに最も近いピクセル全体に丸めるように指示しますUseLayoutRounding
結果の信頼性が低い理由は、実際にはコンテンツがレイアウトされていないため、 Path
sが独立してスケーリングされているためです。Canvas
したがって、パスポイントの1つが不均一なピクセル境界に到達すると(一部の画面解像度では発生する可能性があり、他の解像度では発生しない可能性があります)、スケーリングされていないキャンバス内の最も近い仮想ピクセルに丸められ、これはからスケーリングされてからViewbox
再び丸められます最も近いピクセル全体に(Viewbox
のスケーリングによって決定される同じスケールを使用してCanvas
)、丸め誤差を悪化させます。をオフStackPanel.Background
(デフォルトは透明)に設定しCanvas.Background
、ストロークの色の不透明度をダイヤルダウンすると、この図がより簡単にわかります。
パスの丸めがキャンバスとは異なることがわかります
UseLayoutRounding
したがって、操作で小数点が実行されるようにオフにするか、エラーが発生しないようにレイアウトを単純化する必要があります。
たとえば、不適切で不要な固定サイズのキャンバスを削除してパスを拡大縮小させ、次のように設定Path.Stretch = Uniform
すると、次のようになります。
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Viewbox>
<Viewbox>
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Viewbox>
</StackPanel>
その結果:
おそらくあなたが実際に探していたもの
ただし、これが過度に単純化されていて、実際に内部に配置する予定の複数のパスがある場合はCanvas
、実際に独自のレイアウトを実行するコンテナを使用することをお勧めします。当然の選択はGrid
、パスをそのままスケーリングできる方法です。それらをロックステップにGrid
維持します(Canvas
sは子をレイアウトしません)。コードは次のようになります。
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Grid Width="5" Height="5">
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Grid>
</Viewbox>
<Viewbox>
<Grid Width="6" Height="6">
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Grid>
</Viewbox>
</StackPanel>
結果は、セカンダリコンテナがない場合と同じです。
これが-ckに役立つことを願っています