我正在尝试实现自定义分页器来打印列表框内容。我使用的自定义项目模板可以有不同的高度。
我可以在页面上添加项目,但有时项目必须分成两部分。有没有人知道一个好的分裂算法,以避免这个项目中的文本水平分割?
很难找到这种分页的解决方案。我发现的所有分页示例都有固定的项目高度。 使用FlowDocument不是一个选项,因为它在使用许多项时会出现性能问题。
感谢您的建议。
答案 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偏移量超过页面可用空间的项目。我基本上减去一个项目并将其作为页面的最后一个项目。
我真的没有要显示的代码,因为我的实现充斥着其他东西(比如缩放和捕获列标题以在下一页的顶部重新渲染),但这就是它的要点。