C# 一个理智而简单的带触发器的WPF图像按钮?
我已经研究了其他一些堆栈溢出问题,但似乎没有一个简单的解决方案 我有一个按钮,应该是一个图像。在鼠标上,图像发生更改,与鼠标单击相同 我这里有鼠标的代码:C# 一个理智而简单的带触发器的WPF图像按钮?,c#,wpf,C#,Wpf,我已经研究了其他一些堆栈溢出问题,但似乎没有一个简单的解决方案 我有一个按钮,应该是一个图像。在鼠标上,图像发生更改,与鼠标单击相同 我这里有鼠标的代码: <Button Name="btnNext" Grid.Row="3" Padding="15 3" HorizontalAlignment="Right" Click="OnButtonClick" Visibility="Hidden"> <Button.Template>
<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>
这似乎是一个可怕的东西,我觉得,应该是相对简单的代码很多。有没有我缺少的更简单的解决方案?嗯。。。定义控件模板-定义控件模板的主要好处是使其可重用。模板很少内联在元素中定义,但通常在资源字典中定义(甚至在主题字典中,因此每个团队可以有不同的模板)。如果您有3个按钮,您可以像这样使用it模板:
<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>
你仍然可以走一些机会主义的捷径:
最后,如果您想优化您的程序,使其达到行数-权衡工程实践-您将有一个包含MouseEnter和MouseLeave事件的较短程序。代码隐藏中的每个事件处理程序有3行代码,XAML文件中的int有3行代码,总共有9行代码。那么。。。定义控件模板-定义控件模板的主要好处是使其可重用。模板很少内联在元素中定义,但通常在资源字典中定义(甚至在主题字典中,因此每个团队可以有不同的模板)。如果您有3个按钮,您可以像这样使用it模板:
<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>
你仍然可以走一些机会主义的捷径:
最后,如果您想优化您的程序,使其达到行数-权衡工程实践-您将有一个包含MouseEnter和MouseLeave事件的较短程序。代码隐藏中的每个事件处理程序有3行代码,XAML文件中的int有3行代码,您有9行代码。在Silverlight中,我只需将
按钮。Content
设置为图像。这将导致按钮出现在按钮的正面。如果我不想要按钮面,我通常会使用HyperlinkButton.cadrell0:从我可以看出,WPF没有HyperlinkButton):这看起来真的不像是“太多”代码。XAML非常冗长。cadrell0:听起来有点轻描淡写:在Silverlight中,我只需设置按钮。Content
为图像。这将导致按钮出现在按钮的正面。如果我不想要按钮面,我通常会使用HyperlinkButton.cadrell0:从我可以看出,WPF没有HyperlinkButton):这看起来真的不像是“太多”代码。XAML非常冗长。cadrell0:听起来有点轻描淡写:D