2

我正在从我们的 Silverlight 应用程序打印一组标签。从数据库中读取构成数据的数据,并动态创建 UI 元素并将其添加到Canvasfor 布局中。标签以网格形式排列在页面上,行数和列数由所使用的纸材决定。

除了添加一条线以“删除”一个元素(例如,一件商品打折时的原始价格)之外,一切都运行良好:

打印第一页上的标签

印刷品第二页上的标签

这是生成该行的代码:

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是用于显示标签的 Canvas
  • element是要突出的元素(在本例中为原始价格)。

  1. 正在为所有正在打印的标签调用代码。
  2. 绑定是一致的。
  3. 如果我用硬编码值替换绑定,则会绘制线条,因此它似乎是由绑定中的某些内容引起的。然而:
  4. 每个标签的“父”元素的和是相同的ActualHeightActualWidth
  5. 这条线没有在打印输出的其他地方绘制(我可以看到)。如果我在第一页停止输出,则不会出现任何行。
  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;

所以我“测量”文本元素以确保它的高度和宽度得到更新,然后直接从文本元素的and设置Y1、和属性。这会在正确的位置和正确的大小绘制线条。X2HeightWidthActualHeightActualWidth

于 2013-03-28T09:34:32.600 回答