2012-02-29 94 views
1

我看了一些其他堆栈溢出问题,但似乎没有给出一个简单的解决方案。用于带触发器的WPF的简洁形象按钮?

我有一个按钮,应该是一个图像。在MouseOver上,图像改变,与MouseClick相同。

我有鼠标悬停在此代码:

<Button Name="btnNext" Grid.Row="3" Padding="15 3" HorizontalAlignment="Right" Click="OnButtonClick" Visibility="Hidden"> 
     <Button.Template> 
      <ControlTemplate> 
       <Border> 
        <Image Width="90" Height="90"> 
         <Image.Style> 
          <Style TargetType="{x:Type Image}"> 
           <Setter Property="Source" Value="/resources/Button1_A.png" /> 
           <Style.Triggers> 
            <Trigger Property="IsMouseOver" Value="True"> 
             <Setter Property="Source" Value="/resources/Button1_B.png" /> 
            </Trigger> 
           </Style.Triggers> 
          </Style> 
         </Image.Style> 
        </Image> 
       </Border> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 

这似乎是一个可怕的很多代码的东西,我觉得,应该是比较简单的。有没有更简单的解决方案,我错过了?

+1

在Silverlight中,我只是将'Button.Content'设置为图像。这会导致按钮出现在按钮的面上。如果我不想按钮面,我通常使用HyperlinkBut​​ton。 – cadrell0 2012-02-29 18:14:33

+0

cadrell0:据我所知,WPF没有HyperlinkBut​​ton): – IAE 2012-02-29 18:37:27

+0

这真的看起来不像“太多”的代码。 XAML非常冗长。 – cadrell0 2012-02-29 18:40:43

回答

1

呃...你定义一个控件模板 - 定义一个控件模板的主要好处是可重用。模板很少定义内联元素,但通常在资源字典中(甚至在主题词典中,因此每个团队可以有不同的模板)。如果你有3个按钮,你可以使用它模板那样:

<Window.Resources> 
    <ControlTemplate x:Key="ct" TargetType="Button"> 
     <Border> 
      <Image Width="90" Height="90"> 
       <Image.Style> 
        <Style TargetType="{x:Type Image}"> 
         <Setter Property="Source" Value="/resources/a.png" /> 
         <Style.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Source" Value="/resources/b.png" /> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </Image.Style> 
      </Image> 
     </Border> 
    </ControlTemplate> 
</Window.Resources> 

<StackPanel> 
    <Button Name="btnPrev" Padding="15,3" Click="OnButtonClick" Template="{StaticResource ct}" /> 
    <Button Name="btnNext" Padding="15,3" Click="OnButtonClick" Template="{StaticResource ct}" /> 
    <Button Name="btnFinish" Padding="15,3" Click="OnButtonClick" Template="{StaticResource ct}" /> 
</StackPanel> 

还有一些投机取巧的快捷方式,你可以采取:

  1. 如果你没有做与边境什么,你可以删除它。它什么都不贡献。
  2. 没有必要修改Button.Template,有一个控件模板 - 删除这两条线

您将结束(短6线):

<Button Name="btnNext" Padding="15,3" HorizontalAlignment="Right" Click="OnButtonClick"> 
    <Image Width="90" Height="90"> 
     <Image.Style> 
      <Style TargetType="Image"> 
       <Setter Property="Source" Value="/resources/a.png" /> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Source" Value="/resources/b.png" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Image.Style> 
    </Image> 
</Button> 

最后,如果你想要将程序优化为行数 - 交换工程实践 - 您将通过MouseEnter和MouseLeave事件获得更短的程序。在后面的代码中为每个事件处理程序分配3行代码,并且3行代码为<按钮> <图片/ > <按钮> int在XAML文件中,您有9行代码。