Помещение элемента управления WPF (ComboBox) на холст с помощью визуальных элементов - PullRequest
4 голосов
/ 09 марта 2010

Я пишу диаграмму WPF и использую визуальные эффекты для производительности. Код выглядит так:

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

Рядом с DrawingVisual элементами (строка, текст) мне нужно ComboBox на графике. Итак, я попробовал это:

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

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

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

но это не работает, ComboBox не отображается. Чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 17 марта 2010

Canvas "получит" свой размер из своего свойства Children (используя MeasureOverride и ArrangeOverride). Так как вы просто вызываете AddVisualChild, он не добавляется в свойство Children и все еще думает, что он пуст.

Свойство Children является UIElementCollection (ComboBox является UIElement)

1 голос
/ 16 марта 2010

Рассматривали ли вы просто размещение ComboBox внутри панели контейнера вместе с DrawingCanvas2 и поверх DrawingCanvas2 с точки зрения z-порядка?

Таким образом, DrawingCanvas2 может сконцентрироваться на рисовании визуальных элементов, а ваш ComboBox будет работать "из коробки".

0 голосов
/ 17 марта 2010

Правильный ответ: Линда Лю, форум Microsoft WPF , хотя XIU подошел близко к этому.

код:

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

Важно отметить, что box.SelectedIndex должно быть явно установлено не -1, в противном случае элементы в поле нельзя выбрать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...