Задать вопрос
@slavkin

Как в WPF при создании своего компонента (например кнопки), добавить содержимое поверх существующего (например, рамку)?

Всем привет! Я пытаюсь разобраться с написанием собственных контролов в WPF. И у меня возник следующий вопрос: можно ли как-то наложить какое-либо новое содержимое поверх старого? Я понимаю, что у Button уже есть свой Border, но данный вопрос вызван исключительно академическим интересом и приведен в качестве примера.

class CustomButton : Button
{
	private readonly Border _border;
	private readonly VisualCollection _visualChildren;

	protected override Size ArrangeOverride(Size finalSize)
	{
		_border.Arrange(new Rect(0, 0, 100, 100));

		return finalSize;
	}

	protected override Int32 VisualChildrenCount => _visualChildren.Count;
	protected override Visual GetVisualChild(Int32 index) => _visualChildren[index];

	public CustomButton()
	{
		_visualChildren = new VisualCollection(this);

		_border = new Border();
		_border.BorderThickness = new Thickness(2);
		_border.BorderBrush = Brushes.Green;

		_visualChildren.Add(_bottomRight);
	}
}


К примеру, как сделать так, чтобы рамка в данном примере рисовалась поверх Content базового класса Button? Понятно, что я здесь переопределяю визуальное дерево, но могу ли я как-то добавить к нему то, что находится в базовом классе?

Я попробовал вызвать метод base.AddVisualChild у базового класса, в надежде на то, что мой элемент добавится в визуальное дерево Button, но это тоже не принесло результата:

class CustomButton : Button
{
	private readonly Border _border;

	protected override Size ArrangeOverride(Size finalSize)
	{
		_border.Arrange(new Rect(0, 0, 100, 100));

		return finalSize;
	}

	public CustomButton()
	{
		_border = new Border();
		_border.BorderThickness = new Thickness(2);
		_border.BorderBrush = Brushes.Green;
		base.AddVisualChild(_border);
	}
}


Заранее спасибо!

P.S.: есть ли какая-нибудь документация по данным вопросам и, конкретно, разработке кастомных компонентов для WPF? Понятно, что MSDN в первую очередь, буду рад ссылкам на него, может быть я просто не то искал?
P.P.S.: я понимаю, что то, что я хочу сделать здесь, можно сделать через шаблон, но интересует именно программный подход.
  • Вопрос задан
  • 991 просмотр
Подписаться 1 Оценить 6 комментариев
Пригласить эксперта
Ответы на вопрос 2
kyleabrock
@kyleabrock
Системный администратор
Тоже терзался данным вопросам. Самое простое - создать элемент в Blend нажать правой кнопкой мыши - Edit Template->Current Template. Blend сгенерирует Вам XAML текущего элемента. А уже в нем можно делать все что душа пожелает. Либо с помощью кода, либо визуально
Ответ написан
@Hydro
C#/.NET Developer
Canvas Вас спасет, не? Внутрь Canvas кладете кнопку и поверх рисуете рамку
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы