Печать - как форсировать обновление источника? - PullRequest
1 голос
/ 08 февраля 2012

У меня есть свой пользовательский элемент управления, который является сеткой судоку.Он действует как любой элемент управления, такой как список или комбинированный список.Предметы Клетки.Предметы связаны с коллекцией этих ячеек.Мой элемент управления автоматически размещает эти ячейки в сетке (доска 9x9).

Когда я помещаю свой элемент управления на элементы, все выглядит хорошо и ячейки присутствуют.

Проблема в том, когда я пытаюсь распечатать свой элемент управленияиспользуя документ-пагинатор.Элемент управления напечатан, но он пуст, элементов нет.Похоже, что элемент управления должен быть каким-то образом перерисован или уведомлен, чтобы обновить себя и загрузить связанные значения.Есть какие-нибудь подсказки, пожалуйста?

Вот так я генерирую свой элемент управления на лету, прежде чем передать его в документ paginator, который используется для размещения нескольких элементов управления на странице:

private UIElement generateGridControl(SudokuFile file, int row, int column)
{
    //Contsruct control
    View.GridControl.GridControl grid = new View.GridControl.GridControl();

    //Create sudoku data from provided file
    Grid model = new Grid(file.Type, file.ID);
    model.setValues(file.Data);

    //Create new viewmodel for my control and inject it to control
    grid.init(new GridVM(model), file.Save);

    //Set appearance
    grid.Width = 500;
    grid.Height = 500;
    grid.showLabel(true);

    //Create viewbox used to stretch control to desired size and wrap it around my usercontrol
    System.Windows.Controls.Viewbox box = new System.Windows.Controls.Viewbox
                                                  {Stretch = System.Windows.Media.Stretch.Uniform, Child = grid};


    System.Windows.Controls.Grid.SetRow(box, row);
    System.Windows.Controls.Grid.SetColumn(box, column);

    box.Margin = new Thickness(5);

    return box;
}

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Печать в WPF все еще кажется мне чем-то вроде черной магии. Есть несколько подводных камней, с которыми я столкнулся. Во-первых, если элемент управления не установлен в видимой части экрана и ему разрешено выполнять рендеринг, элемент управления имеет тенденцию к неправильной печати. Такие вещи, как преобразования макета, потерпят неудачу, если, например, элемент управления не отображается на экране. Еще одна полезная вещь - вызвать метод «Измерить и расположить» для объекта, который вы пытаетесь напечатать.

grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
grid.Arrange(new Rect(0, 0, grid.Height, grid.Width));
0 голосов
/ 08 февраля 2012

ViewBox необходимо рассчитать начальный макет.Позвоните

box.UpdateLayout();

, прежде чем вернуться из generateGridControl.Помните, что UpdateLayout , как правило, не вызывает обновления макета, а влияет только на элементы, для которых IsMeasureValid или IsArrangeValid имеет значение false.Во всяком случае, здесь это будет работать, так как это первоначальный макет.

...