4 Stimmen

Einfügen des WPF-Steuerelements (ComboBox) in die Leinwand mit Visuals

Ich schreibe ein WPF-Diagramm und verwende Visuals für die Leistung. Der Code sieht aus wie:

public class DrawingCanvas2 : Canvas
{
    private List<Visual> _visuals = new List<Visual>();

    protected override Visual GetVisualChild( int index ) { return _visuals[index]; }
    protected override int VisualChildrenCount { get { return _visuals.Count; } }

    public void AddVisual( Visual visual )
    {
        _visuals.Add( visual );

        base.AddVisualChild( visual );
        base.AddLogicalChild( visual );
    }
}

Neben DrawingVisual Elemente (Zeile, Text) brauche ich eine ComboBox in der Tabelle. Also habe ich dies versucht:

    public DrawingCanvas2()
    {
        ComboBox box = new ComboBox();
        AddVisual( box );

        box.Width = 100;
        box.Height = 30;

        Canvas.SetLeft( box, 10 );
        Canvas.SetTop( box, 10 );
    }

aber es funktioniert nicht, es wird keine ComboBox angezeigt. Was übersehe ich?

1voto

micahtan Punkte 17264

Haben Sie in Erwägung gezogen, nur die ComboBox innerhalb eines Container-Panels zusammen mit der DrawingCanvas2, und oben auf der DrawingCanvas2 in Bezug auf die Z-Reihenfolge zu setzen?

Auf diese Weise kann sich Ihr DrawingCanvas2 auf das Zeichnen von Bildmaterial konzentrieren und Ihre ComboBox verhält sich out-of-the-box.

1voto

XIU Punkte 794

Der Canvas erhält seine Größe von seiner Children-Eigenschaft (unter Verwendung von MeasureOverride und ArrangeOverride). Da Sie gerade AddVisualChild aufrufen, wird es nicht zur Children-Eigenschaft hinzugefügt und es denkt immer noch, dass es leer ist.

Die Eigenschaft Children ist eine UIElementCollection (ComboBox ist ein UIElement)

0voto

Mikhail Poda Punkte 5638

Die richtige Antwort lautet Linda Liu, Microsoft WPF-Forum obwohl XIU ihm sehr nahe kam.

lautet der Code:

    public DrawingCanvas2() : base()
    {
        ComboBox box = new ComboBox();
        AddVisual( box );

        Size outputSize = new Size( 100, 20 );

        box.Measure( outputSize );
        box.Arrange( new Rect( outputSize ) );
        box.UpdateLayout();

        box.Items.Add( "hello1" );
        box.Items.Add( "hello2" );
        box.Items.Add( "hello3" );

        box.SelectedIndex = 1;
    }

Es ist wichtig zu beachten, dass box.SelectedIndex muss explizit auf nicht gesetzt werden -1 sonst sind die Gegenstände in der Box nicht wählbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X