zoukankan      html  css  js  c++  java
  • 【WPF】XAML实现按钮背景图片的点击切换

    原因:要做一组搜索结果的排序按钮(类似一组RadioButton),效果像下图这样。想法是使用原生的按钮控件,将文字左对齐,整个按钮背景是一张图片,通过样式Trigger控制字体变色、背景图切换。
    需求:RadioButton开关按钮,点击后切换自身按钮的背景图片。

    这里写图片描述

    MyRadioButton.xaml

    <ResourceDictionary  x:Class="HomeDecorationPSD.Presentation.Style.MyRadioButton"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:HomeDecorationPSD.Presentation.Style"
            mc:Ignorable="d">
    
        <ResourceDictionary.MergedDictionaries>
            <!-- 引入颜色字符串 -->
            <ResourceDictionary Source="/Presentation/Resources/ColorResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
    
        <Style x:Key="myRadioButton" TargetType="{x:Type RadioButton}">
            <Setter Property="BorderThickness" Value="0"></Setter>
            <Setter Property="Width" Value="80"></Setter>
            <Setter Property="Height" Value="30"></Setter>
            <Setter Property="Foreground" Value="{StaticResource LightGreyColor}"/>
    
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type RadioButton}">
                        <Grid x:Name="grid" VerticalAlignment="Center">
                            <Border x:Name="border" BorderThickness="1" BorderBrush="{StaticResource LightGreyColor}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
                                    HorizontalAlignment="Center" Background="#E9E9E9" Padding="5,0,0,0">
                                <ContentPresenter Content="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </Grid>
    
                        <!-- 触发器:设置字体的颜色 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="Foreground" Value="{StaticResource SoftRedColor}"/> <!-- 被引入的颜色字符串 -->
                                <Setter TargetName="border" Property="Background">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="/HomeDecorationPSD;component/Presentation/Resources/Images/down_arrow_selected.png" Stretch="Fill"/>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="false">
                                <Setter Property="Foreground" Value="{StaticResource LightGreyColor}"/>
                                <Setter TargetName="border" Property="Background"> <!-- 必须指明TargetName -->
                                    <Setter.Value>
                                        <ImageBrush ImageSource="/HomeDecorationPSD;component/Presentation/Resources/Images/down_arrow.png" Stretch="Fill"/>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
    
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    坑点:

    • ControlTemplate必须使用一个Border包裹。
    • 在Trigger中给按钮设置文字颜色时,使用Foreground不需要指明TargetName,但是给背景设置图片时,必须要指明TargetName,否则无效果。(非常坑爹,运行无报错,能看到文字变色,不能看到背景图)
  • 相关阅读:
    python csv例子
    【LR11】Error -27796: Failed to connect to server"server:port": [10060] Connection timed out错误解决办法
    LR11 scan correlation 卡死解决方案
    EC笔记:第三部分:13、以对象管理资源
    EC笔记:第二部分:12、复制对象时勿忘其每一个成分
    EC笔记:第二部分:11:在operator=中处理“自我赋值”
    EC笔记,第二部分:10.让=返回指向*this的引用
    EC笔记,第二部分:9.不在构造、析构函数中调用虚函数
    EC笔记,第二部分:8.别让异常逃离析构函数
    EC笔记,第二部分:7.为多态基类声明虚析构函数
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-how-to-change-button-background-image-by-click.html
Copyright © 2011-2022 走看看