2

Silverlight アプリケーションから一連のラベルを印刷しています。データを構成するデータがデータベースから読み取られ、UI 要素がオンザフライで作成され、Canvasレイアウト用に追加されます。ラベルはページ上にグリッド状に配置されます。行と列の数は、使用する用紙によって決まります。

要素を「打ち消す」ための行の追加を除いて、すべて正常に機能しています (たとえば、アイテムが販売されているときの元の価格)。

印刷物の 1 ページ目のラベル

印刷物の 2 ページ目のラベル

これは、行を生成するコードです。

var line = new Line { StrokeThickness = 2, Stroke = new SolidColorBrush(Colors.Black) };
line.X1 = 0;
line.SetBinding(Line.Y1Property, new Binding { ElementName = element.Name, Path = new PropertyPath("ActualHeight") });
line.Y2 = 0;
line.SetBinding(Line.X2Property, new Binding { ElementName = element.Name, Path = new PropertyPath("ActualWidth") });
// Insert the element straight after the element it's bound to
canvas.Children.Insert(canvas.Children.IndexOf(element) + 1, line);
line.SetValue(Canvas.TopProperty, element.GetValue(Canvas.TopProperty));
line.SetValue(Canvas.LeftProperty, element.GetValue(Canvas.LeftProperty));
// and make sure it's Z index is always higher
line.SetValue(Canvas.ZIndexProperty, (int)element.GetValue(Canvas.ZIndexProperty) + 1);
  • canvasラベルを表示するために使用されているキャンバスです
  • element突き出す要素です (この場合は元の価格)。

  1. コードは、印刷されるすべてのラベルに対して呼び出されています。
  2. バインディングは一貫しています。
  3. バインディングをハードコードされた値に置き換えると、線が描画されるため、バインディングの何かが原因であるように見えます。でも:
  4. 「親」要素のActualHeightandは、各ラベルで同じです。ActualWidth
  5. 線はプリントアウトの他の場所に描かれていません (私が見ることができます)。1 ページ目で出力を停止すると、行が表示されません。
  6. 他のすべてが表示され、正しい場所に表示されます。

私は何を逃したのですか?

4

1 に答える 1

1

どうやらバインディングに問題があったようです。行にバインディングを追加するとすぐに何をしても、最初のページから消えてしまうこともありました。

最終的にうまくいったのは、コードを次のように変更することだけでした。

element.Measure(new Size(canvas.Width, canvas.Height));
var line = new Line { StrokeThickness = 2, Stroke = new SolidColorBrush(Colors.Black) };
line.X1 = 0.0;
line.Y1 = element.ActualHeight;
line.Y2 = 0.0;
line.X2 = element.ActualWidth;
// Insert the element straight after the element it's bound to
canvas.Children.Insert(canvas.Children.IndexOf(element) + 1, line);
line.SetValue(Canvas.TopProperty, element.GetValue(Canvas.TopProperty));
line.SetValue(Canvas.LeftProperty, element.GetValue(Canvas.LeftProperty));
// and make sure it's Z index is always higher
line.SetValue(Canvas.ZIndexProperty, (int)element.GetValue(Canvas.ZIndexProperty) + 1);
line.Height = element.ActualHeight;
line.Width = element.ActualWidth;

そのため、テキスト要素を「測定」して、高さと幅が更新されていることを確認し、テキスト要素のとからY1X2HeightおよびWidthプロパティを直接設定します。これにより、正しい位置と正しいサイズで線が描画されます。ActualHeightActualWidth

于 2013-03-28T09:34:32.600 に答える