2012-02-08 2 views
1

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

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

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

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

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; 
} 
+0

Я вообще не знаю о документе paginator, но я предполагаю, что ваш ViewBox никогда не получит полный цикл макета/рендеринга. Попробуйте 'box.UpdateLayout()' перед возвратом. – Clemens

ответ

0

ViewBox нуждается в исходном макете для расчета. Звонок

box.UpdateLayout(); 

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

+0

Спасибо, отлично работает. –

1

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

grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
grid.Arrange(new Rect(0, 0, grid.Height, grid.Width)); 
+0

Люблю этот ответ! – MyKuLLSKI

+0

Я вызываю меру, а элементы управления видны на экране. Есть видимые побочные эффекты и фон управления, но контроль пуст - например, нет никаких элементов. –

+1

UpdateLayout не является гарантированным решением. Прочтите примечание в конце этой статьи MSDN. [Макет обновления MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.updatelayout.aspx). Если ваш макет становится более сложным, он может начать сбой. –

Смежные вопросы