在Aero上覆盖WPF中的按钮背景

因此,希望很简单,将按钮的背景更改为LightGreen,当鼠标光标hover在其上时为绿色,按下时将DarkGreen更改为DarkGreen。 以下XAML是我的第一次尝试:

      

但是,唉,这不起作用。 我们只是实现目标的1/3。 是的,按钮变为浅绿色,但只要将鼠标hover在按钮上或按下它,您就会获得相应按钮状态的标准Aero镀铬。 不想放弃,我尝试以下放荡:

 ...    ... 

现在我们已经从Aero.NormalColor.xaml中获得了整个friggin’控制模板。 唉,这没什么改变。 然后我从Microsoft_Windows_Themes:ButtonChrome元素中删除两个属性( RenderPressedRenderMouseOver )。 不过,没有变化。 然后我删除Button的Background属性的设置,只留下PresentationFramework.Aero程序集的名称空间声明:

 ... 

最后,我们取得了进展。 我们已经从1/3的要求变为2/3,IsMouseOver和IsPressed工作,但在按钮的正常状态(没有被碾压或按下)时没有浅绿色背景,因为我已经删除了按钮的Background属性,以使其他两个状态应用并可见。 现在,在这个疯狂的XAML无法让我们获得正常按钮状态的LightGreen背景之后,我修改了样式以在那里抛出背景颜色:

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

最后,它按预期工作。

我是疯了,还是这些(以及更多)你必须通过Aero主题来改变一个按钮的背景颜色(正常,hover,按下)? 也许,如果我不必将整个dang ButtonTemplate包含在那里,只是为了从中删除两个属性( RenderMouseOverRenderPressed ),生活就不会那么糟糕。

谢谢你的帮助 – 我结束了。

更新:但等待还有更多。 而不是从控件模板中删除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)。

如果有人对如何使用Binding 覆盖 TemplateBinding只有控制模板中需要更改的两个属性的任何建议,而不重复aero xaml批发的整个chrome定义,我很满意。

Button的默认模板使用ButtonChrome ,它执行自己的绘图。 如果要完全摆脱默认外观,则需要定义自己的模板,而不需要ButtonChrome 。 我知道这听起来很乏味,但您只需要执行一次:您可以将自定义样式放在资源字典中,然后使用StaticResource引用它。 请注意,您还可以使用{x:Type Button}作为样式键( x:Key属性)将样式应用于应用中的所有按钮