Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个理智而简单的带触发器的WPF图像按钮?_C#_Wpf - Fatal编程技术网

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>

你仍然可以走一些机会主义的捷径:

  • 如果您没有对Border执行任何操作,可以将其删除。它毫无用处
  • 无需修改Button.Template和ControlTemplate-删除这两行
  • 您将得到(短6行):

    
    

    最后,如果您想优化您的程序,使其达到行数-权衡工程实践-您将有一个包含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>
    
    
    
    你仍然可以走一些机会主义的捷径:

  • 如果您没有对Border执行任何操作,可以将其删除。它毫无用处
  • 无需修改Button.Template和ControlTemplate-删除这两行
  • 您将得到(短6行):

    
    

    最后,如果您想优化您的程序,使其达到行数-权衡工程实践-您将有一个包含MouseEnter和MouseLeave事件的较短程序。代码隐藏中的每个事件处理程序有3行代码,XAML文件中的int有3行代码,您有9行代码。

    在Silverlight中,我只需将
    按钮。Content
    设置为图像。这将导致按钮出现在按钮的正面。如果我不想要按钮面,我通常会使用HyperlinkButton.cadrell0:从我可以看出,WPF没有HyperlinkButton):这看起来真的不像是“太多”代码。XAML非常冗长。cadrell0:听起来有点轻描淡写:在Silverlight中,我只需设置
    按钮。Content
    为图像。这将导致按钮出现在按钮的正面。如果我不想要按钮面,我通常会使用HyperlinkButton.cadrell0:从我可以看出,WPF没有HyperlinkButton):这看起来真的不像是“太多”代码。XAML非常冗长。cadrell0:听起来有点轻描淡写:D