WPF -ContentControlをカスタムキャンバスに追加します
-
08-10-2019 - |
質問
Canvasから継承されたカスタムDrawingCanvasがあります。次のコードでDrawingCanvasにContentControlを追加すると、何も表示されません。
GraphicsRectangle rect = new GraphicsRectangle(0, 0, 200, 200, 5, Colors.Blue);
DrawingContainer host = new DrawingContainer(rect);
ContentControl control = new ContentControl();
control.Width = 200;
control.Height = 200;
DrawingCanvas.SetLeft(control, 100);
DrawingCanvas.SetTop(control, 100);
control.Style = Application.Current.Resources["DesignerItemStyle"] as Style;
control.Content = host;
drawingCanvas.Children.Add(control);
GraphicsRectangleは描画視聴者であり、上のコンストラクターは(0,0)左上ポイントと200の長さがグラフィックスレクタンのDrawingContextを持つ長方形を描画します。 DrawingContainerはフレームワークセレメントであり、1人の子供がいます。 DrawingContainerは、GetVisualChildとVisualChildRencountオーバーライドメソッドを実装します。最後に、ContentControlのコンテンツプロパティは、DrawingVisualのコンテンツを表示できるように、DrawingContainerに設定されています。
作成されたContentControlを通常のキャンバスに追加すると、コントロールが正しく表示されます。その理由は、DrawingCanvasがArrangeOverRideメソッドを実装していないことだと思います。 MeasureOverRideメソッドのみを実装します。また、DrawingContainerは測定を実装してオーバーライドメソッドを実装しません。何か案は?
解決
問題にはDrawingCanvasのArrangeOverRideメソッドが欠落していると思ったように。 DrawingCanvasに次のArrangeOverRideメソッドを追加すると、ContentControlsが正しく表示されます。
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (Visual child1 in children)
{
if (child1 is DrawingVisual)
continue;
ContentControl child = child1 as ContentControl;
GraphicsBase content = ((DrawingContainer)(child.Content)).GraphicsObject;
child.Arrange(new Rect(DrawingCanvas.GetLeft(child), DrawingCanvas.GetTop(child), content.Width, content.Height));
}
return arrangeSize;
}
GraphicsBaseは、GraphicsRectangleクラスのベースです。グラフィックスベースのサイズを見つけるために、グラフィックスレクタルのコンストラクターに設定されたグラフィックスベースに幅と高さの特性を追加しました。