Intereting Posts
Неоднозначное общее ограничение T: class vs T: struct Требуется RegEx для удаления всех алфавитов из строки Должен ли я использовать среду OwinContext для хранения данных конкретных приложений на запрос Оператор ‘&&’ не может применяться к операнду типа ‘bool’ и ‘int’ Что определяет возвращаемое значение Path.GetTempPath ()? Получите коллекцию перенаправленных URL-адресов из HttpWebResponse Как заполнить квадрат меньшими квадратами / прямоугольниками? Как исправить вложенные проблемы управления флеш-памятью winform C # Воспоминание функций с произвольным числом аргументов Можно ли запустить GC.Collect в фоновом streamе? Как я могу запустить окно PhantomJS + Selenium в фоновом режиме? Ошибка несанкционированного доступа к html-страницам в IIS 7.0 ListViewItem IsSelected Binding – работает для WPF, но не для WinRT WPF MVVM Связывание динамического управления в коде позади и переход в View Крутой код. IoC на помощь

Переопределение фона кнопки в WPF на Aero

Таким образом, желание прост, измените фон кнопки на LightGreen, зеленый, когда курсор мыши на него навивается и DarkGreen при нажатии. Следующей XAML является моя первая попытка:

      

Но, увы это не работает. Мы только на 1/3 пути к цели. Да, кнопка становится светло-зеленой, но как только вы наводите ее на нее или нажимаете, вы получаете стандартный Aero chrome для соответствующих состояний кнопок. Не желая сдаваться, я пытаюсь сделать следующий разврат:

 ...    ... 

Теперь у нас есть весь шаблон управления, который был добавлен в Aero.NormalColor.xaml . Увы, это ничего не меняет. Затем я собираюсь удалить два атрибута ( RenderPressed и RenderMouseOver ) из элемента Microsoft_Windows_Themes:ButtonChrome . Тем не менее, изменений нет. Затем я удаляю настройку атрибута Background Button, оставляя только объявление пространства имен для сборки PresentationFramework.Aero:

 ... 

Наконец, у нас есть прогресс. Мы перешли от 1/3 требований к 2/3 пути, при работе IsMouseOver и IsPressed, но без светло-зеленого фона во время нормального состояния кнопки (не замалчивания или нажатия), так как я удалил свойство Background из кнопки, чтобы применить другие два состояния и быть видимыми. Теперь, после того, как этот маниакальный XAML не смог получить нам фона LightGreen для нормального состояния кнопки, я изменяю стиль, чтобы также добавить туда цвет фона:

  <Button xmlns... <ControlTemplate... ...    

Наконец, он работает по назначению.

Я с ума сошел, или эти (и больше) обручи, которые вам нужно пройти с темой Aero, чтобы просто изменить цвет фона кнопки в некоторых ее различных состояниях (нормальный, зависающий, нажатый)? Может быть, жизнь не была бы такой плохой, если бы мне не пришлось включать в нее весь Dang ButtonTemplate, чтобы удалить из него два атрибута ( RenderMouseOver и RenderPressed ).

Спасибо за любую помощь – я нахожусь в конце.

Обновление: Но подождите, что к этому больше. Вместо того, чтобы удалить атрибуты RenderMouseOver и RenderPressed из шаблона управления, просто изменив их:

 <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" ... RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" ... 

чтобы:

 <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" ... RenderMouseOver="{Binding IsMouseOver}" RenderPressed="{Binding IsPressed}" ... 

…, также устраняет проблему (игнорирование триггеров стиля кнопки). Я думаю, что корень проблемы заключается в том, что привязки шаблонов применяются во время компиляции (по соображениям производительности), а регулярные привязки применяются во время выполнения. Из-за этого привязки из триггеров стиля от отдельных кнопок не используются, если атрибуты используют привязки шаблонов (т. Е. Вместо этого используются IsMouseOver и IsPressed из исходного шаблона).

Сказав все вышеизложенное, вот канонический пример изменения фона кнопки в Aero, сохраняя его исходный шаблон управления:

        

Это, конечно, предполагает, что только одна кнопка имеет такой стиль, иначе шаблон и стиль могут быть перемещены в раздел ресурсов где-нибудь. Кроме того, нет триггера для состояния по умолчанию кнопки, но его легко добавить к приведенному выше примеру (не забудьте изменить атрибут RenderDefaulted в шаблоне управления, чтобы использовать Binding вместо TemplateBinding).

Если у кого-то есть предложения о том, как переопределить TemplateBinding с привязкой только для двух атрибутов в шаблоне управления, которые необходимо изменить, без повторения всего определения chrome из aero xaml wholesale, я все уши.

Шаблон по умолчанию для Button использует ButtonChrome , который выполняет собственный чертеж. Если вы хотите полностью избавиться от внешнего вида, вам нужно определить свой собственный шаблон без ButtonChrome . Я знаю, это звучит утомительно, но вам нужно сделать это только один раз: вы можете поместить свой собственный стиль в словарь ресурсов и просто обратиться к нему с помощью StaticResource . Обратите внимание, что вы также можете применить стиль ко всем кнопкам в вашем приложении, используя {x:Type Button} в качестве ключа стиля (атрибут x:Key )