Обтекание элемента управления в рамке с использованием стилей без перезаписи внешнего вида по умолчанию - PullRequest
1 голос
/ 07 декабря 2009

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

Я хотел бы сделать эквивалент этого:

<Border BorderBrush="Red" BorderThickness="3">
  <Button>Hello!</Button>
</Border>

Просто для любого контроля, без необходимости фактически оборачивать все в Border. Я попытался сделать это, изменив Template в стиле следующим образом:

<ControlTemplate TargetType="{x:Type Button}">
  <Border BorderBrush="Red" BorderThickness="3">
    <ContentPresenter />
  </Border>
</ControlTemplate>

Это успешно добавляет границу, но также стирает любой другой стиль на Button. Я бы хотел, чтобы он по-прежнему выглядел как кнопка, просто с дополнительной рамкой вокруг него.

Есть мысли?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2009

Это для проверки? Один хороший вариант - нарисовать границу на слое Adorner.

1 голос
/ 07 декабря 2009

Стили могут наследоваться (используя свойство BasedOn), но вы имеете дело с шаблоном, поэтому вам нужно получить копию текущего шаблона кнопки и отредактировать свою собственную копию. Варианты для этого:

  • Смешивание - редактирование> шаблон> создать копию
  • Reflector - используйте плагин для просмотра BAML для чтения стиля xaml по умолчанию из рассматриваемой dll
  • Найдите здесь управление: http://msdn.microsoft.com/en-us/library/cc278075(VS.95).aspx
  • Снуп и другие шпионские инструменты
0 голосов
/ 07 декабря 2009

Мои предположения:

  1. Я не могу связываться с шаблонами управления по умолчанию
  2. Все, что я хочу сделать, это обернуть элемент управления в рамку
  3. Этот контроль может быть любым типом управления в любой ситуации

Мое решение состоит в том, чтобы использовать прикрепленное свойство зависимости. После установки свойства вы получаете родителя из логического дерева. Затем мы меняем ребенка с ребенком, завернутым в бордюр.

Естественно, вы можете расширить это для разных родителей.

решение на GitHub находится на http://github.com/RookieOne/WrapControlInBorder

Вот небольшой фрагмент кода:

            var parent = LogicalTreeHelper.GetParent(elementToWrap);

        var panel = parent as Panel;
        if (panel != null)
        {
            panel.Children.Remove(elementToWrap);
            var border = Wrap(elementToWrap);
            panel.Children.Add(border);
            return;
        }

        var contentParent = parent as ContentControl;
        if (contentParent != null)
        {
            contentParent.Content = null;
            var border = Wrap(elementToWrap);
            contentParent.Content = border;
            return;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...