Domanda

Ho un DrawingCanvas personalizzati che viene ereditato da tela di canapa. Quando aggiungo un ContentControl per DrawingCanvas con i seguenti spettacoli codice di niente su.

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 è un DrawingVisual e il costruttore sopra disegna un rettangolo con punto a sinistra (0,0) superiore e lunghezza 200 alla DrawingContext di GraphicsRectangle. DrawingContainer è un FrameworkElement ed ha un figlio, che è rect sopra, determinato con il costruttore. DrawingContainer implementa GetVisualChild e VisualChildrenCount metodi di override. Finalmente, contenuti di proprietà di ContentControl è impostata sul DrawingContainer per essere in grado di mostrare il contenuto del DrawingVisual.

Quando aggiungo il ContentControl creato per una tela di canapa regolare, il controllo viene mostrato correttamente. Credo che il motivo è che DrawingCanvas non implementa il metodo ArrangeOverride. E 'solo implementa il metodo MeasureOverride. Inoltre DrawingContainer non implementa Misurare e Disporre i metodi di override. Qualche idea?

È stato utile?

Soluzione

Come ho pensato che il problema mancava metodo ArrangeOverride in DrawingCanvas. Con il seguente metodo ArrangeOverride aggiunto DrawingCanvas, ContentControls sono mostrati correttamente.

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

dove GraphicsBase è la base della classe GraphicsRectangle. Al fine di trovare la dimensione del GraphicsBase, ho aggiunto proprietà width e height per GraphicsBase che figurano nel costruttore di GraphicsRectangle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top