Я решил эту проблему, создав присоединенное свойство зависимости в статическом классе, 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 превышает доступное пространство для страницы. Я в основном вычитаю один элемент и делаю его последним на странице.
У меня нет кода для отображения, потому что моя реализация изобилует другими вещами (такими как масштабирование и захват заголовков столбцов для повторного рендеринга вверху следующей страницы), но в этом суть.