使用自定义分页打印视觉效果

时间:2010-08-25 16:32:41

标签: wpf printing listbox pagination

我正在尝试实现自定义分页器来打印列表框内容。我使用的自定义项目模板可以有不同的高度。

我可以在页面上添加项目,但有时项目必须分成两部分。有没有人知道一个好的分裂算法,以避免这个项目中的文本水平分割?

很难找到这种分页的解决方案。我发现的所有分页示例都有固定的项目高度。 使用FlowDocument不是一个选项,因为它在使用许多项时会出现性能问题。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

我通过在静态类PaginationBlocking中创建附加依赖项属性来解决这个问题:

public static class PaginationBlocking
{
    public static IList<UIElement> GetBlockList(UIElement element)
    {
        return (IList<UIElement>)element.GetValue(BlockListProperty);
    }

    public static void SetBlockList(UIElement element, IList<UIElement> value)
    {
        element.SetValue(BlockListProperty, value);
    }

    public static readonly DependencyProperty BlockListProperty =
        DependencyProperty.RegisterAttached("BlockList", typeof(IList<UIElement>), 
            typeof(PaginationBlocking), new UIPropertyMetadata(null, OnBlockListPropertyAttached));

    static void OnBlockListPropertyAttached(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as UIElement;
        if(element.is_null() || (bool)element.GetValue(IsBlockListOwnerProperty)) return;

        var list = e.NewValue as IList<UIElement>;
        if(list.is_null()) return;

        if(!list.Contains(element)) list.Add(element);
    }
}

我将该属性附加到我不想跨页面的任何元素:

<local:MyUserControl Height="20" UI:PaginationBlocking.BlockList="{Binding blockList}" />
<local:MyUserControl Height="30" UI:PaginationBlocking.BlockList="{Binding blockList}" />

显然你必须有一个List<UIElement>可以绑定。绑定UIElement会将其添加到绑定列表中。

我通过创建VisualBrush并使用它绘制Canvas的背景来进行分页。当我进行分页时,我枚举列表中的所有元素以获得相对于左上角的y偏移量。我迭代,直到我到达一个y偏移量超过页面可用空间的项目。我基本上减去一个项目并将其作为页面的最后一个项目。

我真的没有要显示的代码,因为我的实现充斥着其他东西(比如缩放和捕获列标题以在下一页的顶部重新渲染),但这就是它的要点。