我正在尝试为我的应用程序添加一个简单的视觉效果,表示页面上的打印边距,以帮助用户避免定位可能超出范围的数据。为此,我有一个方法,它获取纸张大小,DPI和边距设置信息,并使用它来制作一个ObservableCollection(Rect),它包含四个Rect,每个边对应一个。 XAML中的ListBox通过返回集合的GetMargins()属性绑定到集合。我在托管ListBox的Grid的Resource部分为页面定义了一个DataTemplate,ListBox在ItemsPanelTemplate中使用了Canvas,这样我就可以使用每个Rect的x,y,width和height在页面上定位和调整一些Rectangle的大小。 。这是XAML:
在Grid.Resources中:
<!--
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>
当我运行应用程序时,上面的代码会导致字符串输出而不是页面边框上的浅绿色矩形。例如,左侧边距的Rect将显示为“0,0,75,1650”,而不是宽度为75px的矩形,并且跨越整个页面的高度。底部边距字符串位于左下角,右边距显示在右上角,正如预期的那样。所以绑定工作正常,它们定位正确,但由于某种原因没有绘制。
我觉得有趣的是我有另一个ObservableCollection填充了我自己设计的对象,这些对象在Page的表面上以几乎相同的方式定位和设置样式。绑定到该集合的ListBox的XAML设置方式完全相同,但每个项目的DataTemplate稍微复杂一些(9个矩形而不是一个)。它运作得很好。他们也住在同一个网格中。
所以我没有看到我在这个问题上出错了,只是如果我得到toString()输出它可能是一个DataTemplate问题。思考?发现我的错误?
谢谢:)
答案 0 :(得分:0)
在我看来,你在DataTemplate中有错误的DataType。 GetMargins()返回Rect的ObservableCollection对吗?然后ListboxItems是从Rect创建的,而您的DataTemplate是为Page class。
定义的