1

我正在尝试向我的应用程序添加一个简单的视觉效果来表示页面上的打印边距,以帮助用户避免定位可能超出范围的数据。为此,我有一个方法,它获取纸张大小、DPI 和边距设置信息,并使用它来制作一个 ObservableCollection(of Rect),其中包含四个 Rect,一个用于页面的每个边缘。XAML 中的 ListBox 通过返回集合的 GetMargins() 属性绑定到集合。我在托管 ListBox 的网格的资源部分中为页面定义了一个 DataTemplate,并且 ListBox 在 ItemsPanelTemplate 中使用了一个画布,以便我可以使用每个 Rect 的 x、y、宽度和高度在页面上定位和调整一些矩形. 这是 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 填充了我自己设计的对象,它们在页面表面上的定位和样式几乎相同。绑定到该集合的 ListBox 的 XAML 的设置方式完全相同,但每个项目的 DataTemplate 稍微复杂一些(9 个矩形,而不仅仅是一个)。它工作得很好。他们也都生活在同一个网格中。

所以我看不出我在哪里出错了,除了如果我得到 toString() 输出,它可能是一个 DataTemplate 问题。想法?发现我的错误?

谢谢 :)

4

1 回答 1

0

在我看来,您在 DataTemplate 中有错误的 DataType。GetMargins() 返回 Rect 的 ObservableCollection 对吗?然后 ListboxItems 是从 Rect 创建的,而您的 DataTemplate 是为 Page 类定义的。

于 2012-08-03T16:03:47.827 回答