对于模仿Windows 7任务栏按钮样式的Button
,我有一个ControlTemplate
。我可以将其应用于标准Button
,它看起来恰到好处。对于那些还没有看到Windows 7的人来说,任务栏按钮也有一个行为......当你将鼠标放在按钮上时会出现一个辉光,当你将鼠标移动到它上面时它会水平移动。在WPF中,我的具有行为的自定义按钮应该是扩展的Button,CustomControl还是ControlTemplate?
所以我通过分两个阶段延伸Button
来复制这种行为;首先在xaml中,我使用Trigger
s使用MouseEnter
事件淡入我的'发光',并使用MouseLeave
事件再次淡出;然后在后面的代码中,我实现了一个MouseMove
事件处理程序,将RadialGradientBrush.GradientOrigin
和RadialGradientBrush.Center
属性移动到当前鼠标位置。都很可爱。不过,我总是试图改进我的代码,因为我对WPF有更多的了解,并且对几件事感到好奇。
好了,所以这里的问题...
首先,据我所知,没有任何内置到WPF,这将使我访问在XAML当前鼠标的位置,但有东西,我可以做得到它吗?我的意思是像添加一个类Resources
类似的东西,将当前鼠标位置作为DependencyProperty
,我可以直接绑定到RadialGradientBrush
的Center
和GradientOrigin
属性。
我在这里抓着吸管...目的是要删除后面的代码,如果可能的话,我可以在应用程序中使用ControlTemplate
到Style
所有Button
。或者是这样的行为应该在WPF的代码中?其次,如果在自定义Button
的行为中使用后面的代码真的更好,那么创建CustomControl
还是继续保持现有效果,最好是延长Button
?
最后,如果它保留为扩展Button
,是否有可能使它取代正常的Button
Style
?我正在考虑定义一个Style
Resources
与TargetType
属性集,但没有x:key
属性集将自动设置所有类型的Control
Style
...有些说法,如果任何Button
是在应用程序,他们应该是这种类型的Button
。再一次,抓着吸管,但没有问题。
编辑>>>
这里是我的扩展Button
控制(减去Resources
)的XAML:
<Button.Template>
<ControlTemplate>
<Grid MouseMove="Button_MouseMove">
<Border CornerRadius="3" BorderBrush="#7E000000" BorderThickness="1" Background="#7EFFFFFF">
<Grid Margin="1">
<Rectangle x:Name="BackgroundRectangle" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Fill="{StaticResource Windows7Background}" />
<Rectangle x:Name="Glow" IsHitTestVisible="False" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Opacity="0.0" Fill="{StaticResource GlowBrush}" />
<ContentPresenter RecognizesAccessKey="True" ManyManyProperties="{TemplateBinding}"... />
</Grid>
</Border>
<Grid.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.5" DecelerationRatio="1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:1" DecelerationRatio="1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
</ControlTemplate>
</Button.Template>
对于一个非常有趣的想法+1我不知道附加的行为。这听起来很有趣,但正如你注意到的,我不认为我能用它来解决这个难题。我添加了我的xaml,所以现在你可以看到我只是想调整'Glow''Rectangle'的'Fill'' Brush'的属性。感谢您尝试Liz。 – Sheridan 2011-03-02 21:39:24
@Sheridan很高兴我能为您介绍一些新的东西!我尝试了其他一些东西,但目前还没有运气。绝对是一个有趣的挑战。 – Liz 2011-03-03 00:09:27