了解しました。これを開始するにはどうすればよいですか。
画面にいくつかの形(実際には数千)を描くことができるアプリケーションがあります。それらには、長方形と線の2つのタイプがあります。長方形には塗りつぶしがあり、線にはストローク+ストロークの太さがあります。
2つのファイルからデータを読み取ります。1つは上面のデータ、もう1つは下面のデータです。データを表示するには、キャンバスを内部に持つビューボックスを使用します(コンテンツが適切に引き伸ばされます)。ディスプレイ上の全体は次のようになります(これは正しいです):
これで、まったく同じアプリケーションがこのイメージをプリンターに印刷することになっています(テストには、Windowsに付属のXPSプリンターを使用します)。
私がそれを印刷すると(コードが続きます)、それは上にまったく同じ図面を与えますが、下に次のようになります:
すべての「線」が欠落しているように見えます(長方形が存在します)。下部を表示するには、-1 / -1のスケール変換を使用します(水平方向と垂直方向にミラーリングします)。スケール変換を1/1に設定すると、次のようになります。
今、私は立ち往生しています。なぜすべての線が消えるのですか、ミラーリングされていない場合はそこにあります。また、最も外側の長方形が少しずれています(これはデータが原因である可能性があるため、それに焦点を当てないでください)。
画面に描画するために使用するコードは次のとおりです。
<Viewbox Grid.Row="0" RenderTransform="{Binding RenderTransform}" Margin="20" Name="VwBox">
<Viewbox.RenderTransformOrigin>
<Point X="0.5" Y="0.5"></Point>
</Viewbox.RenderTransformOrigin>
<ItemsControl ItemsSource="{Binding Drawing}" ItemTemplateSelector="{StaticResource DataTypeTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="{Binding DrawingWidth}" Height="{Binding DrawingHeight}">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Left}"/>
<Setter Property="Canvas.Top" Value="{Binding Top}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Viewbox>
印刷については、XAMlに依存していませんが、手動で実行します(ContentPresenterを使用するかどうかに関係なく、変更はありません)。
if (gs is GerberLine)
{
ContentPresenter cp = new ContentPresenter();
var line = new Line();
Canvas.SetLeft(cp, gs.Left);
Canvas.SetTop(cp, gs.Top);
line.X1 = 0.0;
line.Y1 = 0.0;
line.X2 = gs.Width;
line.Y2 = gs.Height;
line.Stroke = gs.Brush;
line.StrokeThickness = ((GerberLine)gs).StrokeThickness;
cp.Content = line;
c.Children.Add(cp);
}
if (gs is GerberRect)
{
var r = new Rectangle();
Canvas.SetLeft(r, gs.Left);
Canvas.SetTop(r, gs.Top);
r.Width = gs.Width;
r.Height = gs.Height;
r.Fill = gs.Brush;
c.Children.Add(r);
}
上面図は常に正しいので(垂直方向にもミラーリングされているため)、水平方向にミラーリングするとすぐに線が消えるように見えます。
何か案は?不明な点がございましたら、お気軽にお問い合わせください。スケール変換と関係があると思いますが、どうしてかわかりません(なぜ画面上で動作するのですか?)。