2013-08-22 2 views
0

Я работаю над настраиваемым элементом управления в WPF, который реализует OnRender, вызывая функцию посещения с собой в качестве посетителя. Элемент управления реализует интерфейс посетителя, который по мере необходимости рисует линии, круги и т. Д. Нет дочерних элементов управления.WPF: Пользовательский макет управления

Это все работает, когда элемент управления отображается, я вижу, как примитивы отображаются из моего вызова OnRender.

Однако то, с чем я борюсь, - это управление макетом, вытекающее из этого. Управление изображением делает именно то, что я хочу сделать. Как воспроизвести это поведение? В частности:

  • Если пользователь не указывает ширину или высоту, я хочу установить визуализированную ширину/высоту элемента управления (либо в моем конструкторе, либо из другой функции, которая управляет компоновкой).
  • Если пользователь задает ширину или высоту для определенного значения, я хочу преобразовать рисунок таким образом, чтобы соотношение сторон элемента управления и чертежа сохранялось.

Я пытаюсь использовать функции MeasureOverride для реализации поведения, которое я хочу, но я не получаю никаких результатов. Мое управление расположено с нулевой шириной/высотой, а затем все мои рисунки рисуются поверх соседних элементов управления. Вот что я пытаюсь до сих пор, надеюсь, это показывает, что я пытаюсь сделать:

protected override Size MeasureOverride(Size constraint) 
{ 
    SymbolLayout symbol = new SymbolLayout(this); 
    component.LayoutSymbol(symbol); 

    Point b1 = MapToPoint(symbol.LowerBound); 
    Point b2 = MapToPoint(symbol.UpperBound); 
    return new Size(b2.X - b1.X, b2.Y - b1.Y); 
} 

Я даже не уверен, что MeasureOverride является правильной функции использовать для достижения этой цели ...

ответ

0

Вам также необходимо переопределить метод ArrangeOverride. Макет в WPF выполняется с помощью пары рекурсивных операций «Измерение и упорядочивание». Измерение просто запрашивает визуальное дерево, каков требуемый размер всех дочерних элементов управления. Это делается рекурсивно, поэтому, если у вас есть дочерние элементы управления, вам нужно будет вызвать «Мера» для всех ваших дочерних элементов как часть вашего переопределения измерений. Аранжировка - это второй шаг, на котором структура указывает контроль над тем, сколько места оно фактически получает. Как и измерение, это выполняется рекурсивно и обычно требует вызова Arrange для каждого дочернего элемента управления, если таковые имеются.

Смежные вопросы