2012-02-08 9 views
1

私はカスタムコントロールを持っています。リストボックスやコンボボックスのようなitemscontrolのように動作します。項目はセルです。アイテムはこれらのセルのコレクションにバインドされています。私のコントロールautomaticalyは、これらのセルをグリッド(9x9ボード)にレイアウトします。印刷 - itemssourceを強制的に更新する方法

私のコントロールをアイテムに配置すると、すべてが見栄えがよく、細胞が存在します。

問題は、ドキュメントのページ設定を使用してコントロールを印刷しようとするときです。コントロールが印刷されていますが、空です。項目がありません。これは、コントロール自体が更新され、バインドされた値をロードするために、何らかの形で再描画または通知する必要があるようです。すべての手がかりをお願いしますか?

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がfalseの要素にのみ影響します。とにかく、初期のレイアウトなので、ここではうまくいきます。

+0

ありがとう、完璧に動作します。 –

1

WPFでの印刷はまだ多少黒魔術として私を打つ:

これは私がページに複数のコントロールを配置するために使用されehichページネータを文書化するためにそれを渡す前に、その場で私のコントロールを生成する方法です。私が暴露した落とし穴がいくつかあります。 1つは、コントロールが画面の可視部分に設定されず、レンダリングが許可されている場合、コントロールが正しく印刷されない場合があります。たとえば、コントロールが画面上にレンダリングされないと、レイアウト変換が失敗します。もう一つ役立つのは、印刷しようとしているアイテムのMeasureとArrangeを呼び出すことです。

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

この回答が大好き! – MyKuLLSKI

+0

私はmeasureとarangeを呼び出し、コントロールは画面に表示されます。目に見えるボンドとコントロールの背景がありますが、コントロールは空です。アイテムが含まれていないようです。 –

+1

UpdateLayoutは保証された修正ではありません。このMSDNの記事の末尾にある注釈を読んでください。 [MSDN更新レイアウト](http://msdn.microsoft.com/en-us/library/system.windows.uielement.updatelayout.aspx)レイアウトが複雑になると、失敗することがあります。 –

関連する問題