2011-02-28 56 views
2

对于模仿Windows 7任务栏按钮样式的Button,我有一个ControlTemplate。我可以将其应用于标准Button,它看起来恰到好处。对于那些还没有看到Windows 7的人来说,任务栏按钮也有一个行为......当你将鼠标放在按钮上时会出现一个辉光,当你将鼠标移动到它上面时它会水平移动。在WPF中,我的具有行为的自定义按钮应该是扩展的Button,CustomControl还是ControlTemplate?

所以我通过分两个阶段延伸Button来复制这种行为;首先在xaml中,我使用Trigger s使用MouseEnter事件淡入我的'发光',并使用MouseLeave事件再次淡出;然后在后面的代码中,我实现了一个MouseMove事件处理程序,将RadialGradientBrush.GradientOriginRadialGradientBrush.Center属性移动到当前鼠标位置。都很可爱。不过,我总是试图改进我的代码,因为我对WPF有更多的了解,并且对几件事感到好奇。

好了,所以这里的问题...

首先,据我所知,没有任何内置到WPF,这将使我访问在XAML当前鼠标的位置,但有东西,我可以做得到它吗?我的意思是像添加一个类Resources类似的东西,将当前鼠标位置作为DependencyProperty,我可以直接绑定到RadialGradientBrushCenterGradientOrigin属性。

我在这里抓着吸管...目的是要删除后面的代码,如果可能的话,我可以在应用程序中使用ControlTemplateStyle所有Button。或者是这样的行为应该在WPF的代码中?其次,如果在自定义Button的行为中使用后面的代码真的更好,那么创建CustomControl还是继续保持现有效果,最好是延长Button

最后,如果它保留为扩展Button,是否有可能使它取代正常的ButtonStyle?我正在考虑定义一个StyleResourcesTargetType属性集,但没有x:key属性集将自动设置所有类型的ControlStyle ...有些说法,如果任何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> 

回答

0

在阅读出售& Griffiths编程WPF书(一本很好的书)中的相关章节之后,我想我现在可以回答我自己的问题。根据这些人,UserControl“旨在提供一个类似的功能,以在其他UI框架中的用户控件”。由此,它们意味着用户控件是一种不可见的面板,其包含一组控件,如特定的窗体。还有一点需要注意的是,他们“通常不支持通过模板进行定制”。

关于CustomControl s,他们说:“[自定义]控件的作用是定义基本行为......如果您需要的行为不是由任何现有的控件提供的,并且您不能通过将几个控件拼接在一起来创建它,你需要编写一个自定义控件“。

进一步的建议是,“控件可以提供一组默认的视觉效果,但它应该允许替换它们以提供与内置控件相同的灵活性......符合此方法的控件,视觉效果与控件分离,通常被描述为looklook ... WPF中内置的所有控件都是无形的“。

通过这个意见去,我想我会创造我的“焕发Button”的新CustomControl,具有默认ControlTemplateStyle。这样,我就能够改变Button的风格,但让顶部的发光鼠标保持在效果之上。

2

你有没有想过使用附加的行为/属性,而不是扩展按钮控制?你可能在不知道它的情况下使用了附加属性,比如Grid.Row和DockPanel.Dock。

基本上,这只是意味着你想添加一块逻辑到现有的控制。 例如在这个example中,用户可以通过附属属性向控件提供画笔。

<Button Content="Button 1" local:Hover.Brush="Red" /> 

附加属性,基本上是一个具有DependencyProperty的静态类。 在你的情况下,它会对鼠标事件作出反应,并相应地设置背景画笔。实际上,附加属性甚至不必关心控件是一个按钮,只是一个可以访问MouseEnter,MouseLeave和MouseMove的控件。

在您的全球按钮样式,你可以附加属性如下:

<Setter Property="local:Hover.Brush" Value="Red" /> 

您可以从一个资源通过您的径向刷为好,因此,如果您想更改配色方案,你不会必须改变行为,只是资源。

更多关于行为...

附加的行为基本上是相同的之类的话。你可以看到Josh Smith(WPF所有东西的专家)的文章here,所以你可以更好地理解你可以用附加的行为/属性做什么其他类型的事情。


编辑:我再次审查您的文章,并意识到这是不是你想改变背景颜色,但在闪耀的画笔。我会尽快更新我的答案并提供更多细节。

+0

对于一个非常有趣的想法+1我不知道附加的行为。这听起来很有趣,但正如你注意到的,我不认为我能用它来解决这个难题。我添加了我的xaml,所以现在你可以看到我只是想调整'Glow''Rectangle'的'Fill'' Brush'的属性。感谢您尝试Liz。 – Sheridan 2011-03-02 21:39:24

+0

@Sheridan很高兴我能为您介绍一些新的东西!我尝试了其他一些东西,但目前还没有运气。绝对是一个有趣的挑战。 – Liz 2011-03-03 00:09:27

相关问题