我试图在我的应用程序中添加一个简单的可视化,表示页面上的打印边距,以帮助用户避免定位可能超出范围的数据。要做到这一点,我有一种方法,它获取纸张大小、DPI和边距设置信息,并使用它来制作一个ObservableCollection(Rect),其中包含四个Rect,每个Rect用于页面的每个边缘。XAML中的ListBox通过返回集合的GetMargins()属性绑定到集合。我在托管ListBox的网格的Resource部分为页面定义了一个DataTemplate,ListBox在ItemsPanelTemplate中使用Canvas,这样我就可以使用每个Rect的x、y、宽度和高度在页面上定位和调整一些矩形的大小。这是XAML:
在网格中。资源:
<!--
A data template for the page margins.
-->
<DataTemplate DataType="{x:Type local:Page}">
<Grid>
<Rectangle
Width="{Binding Width}"
Height="{Binding Height}"
Fill="LightGreen"
Opacity="0.5"
/>
</Grid>
</DataTemplate>
网格中:
<!--
Listbox to present the page margins.
-->
<ListBox
x:Name="PageMarginsListBox"
ItemsSource="{Binding GetMargins}"
Background="Transparent"
IsHitTestVisible="False"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter
Property="Canvas.Left"
Value="{Binding X}"
/>
<Setter
Property="Canvas.Top"
Value="{Binding Y}"
/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
当我运行应用程序时,上面的代码会导致字符串输出,而不是页面边框上的浅绿色矩形。例如,左侧边距的矩形将显示为"0,0,751650",而不是一个宽75像素、横跨整个页面高度的矩形。底部边距字符串位于左下角,右边距显示在右上角,如预期的那样。因此,装订工作正常,它们的位置正确,但由于某种原因没有绘制。
我发现有趣的是,我有另一个ObservableCollection,里面装满了我自己设计的对象,它们在页面表面的位置和样式几乎相同。绑定到该集合的ListBox的XAML以完全相同的方式设置,但每个项都有一个稍微复杂一些的DataTemplate(9个矩形而不是一个)。它运行得很好。他们也住在同一个格子里。
所以我看不出这个问题出在哪里,只是如果我得到的是toString()输出,它可能是一个DataTemplate问题。想法?发现我的错误了吗?
感谢:)
在我看来,DataTemplate中的DataType错误。GetMargins()返回Rect的ObservableCollection对吗?然后从Rect创建ListboxItems,同时为Page类定义DataTemplate。