WPF后台自定义文字带背景的选择状态按钮
如果要转载请注明来出处(http://www.cnblogs.com/therock),谢谢!
描述:可以对按钮的选择或未选择时的文字颜色以及背景图片进行变换。
效果如下:
首先是自定义按钮类:

public class TextImageButton:Button
{
public TextImageButton()
{
this.IsSelectedChanged += new IsSelectedChangedEventHandler(TextImageButton_IsSelectedChanged);
}
private void TextImageButton_IsSelectedChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.IsSelected == true)
{
this.TextColor = SelectedTextColor;
this.Background = SelectedBackground;
}
else
{
this.TextColor = UnSelectedTextColor;
this.Background = UnSelectedBackground;
}
}
public delegate void IsSelectedChangedEventHandler(object sender, DependencyPropertyChangedEventArgs e);
public event IsSelectedChangedEventHandler IsSelectedChanged;
private bool isSelected = false;
public bool IsSelected
{
get{return isSelected;}
set
{
if (isSelected != value)
{
isSelected = value;
IsSelectedChanged(this,new DependencyPropertyChangedEventArgs());
}
}
}
public new static DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached
(
"Background",
typeof(ImageSource),
typeof(Button)
);
public new ImageSource Background
{
get{ return (ImageSource)GetValue(BackgroundProperty);}
set { SetValue(BackgroundProperty, value); }
}
public static DependencyProperty TextColorProperty = DependencyProperty.RegisterAttached
(
"TextColor",
typeof(SolidColorBrush),
typeof(Button)
);
public SolidColorBrush TextColor
{
get { return (SolidColorBrush)GetValue(TextColorProperty); }
set { SetValue(TextColorProperty, value); }
}
public static DependencyProperty TextProperty = DependencyProperty.RegisterAttached
(
"Text",
typeof(string),
typeof(Button)
);
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public ImageSource SelectedBackground { get; set; }
public ImageSource UnSelectedBackground { get; set; }
public SolidColorBrush SelectedTextColor { get; set; }
public SolidColorBrush UnSelectedTextColor { get; set; }
}
{
public TextImageButton()
{
this.IsSelectedChanged += new IsSelectedChangedEventHandler(TextImageButton_IsSelectedChanged);
}
private void TextImageButton_IsSelectedChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.IsSelected == true)
{
this.TextColor = SelectedTextColor;
this.Background = SelectedBackground;
}
else
{
this.TextColor = UnSelectedTextColor;
this.Background = UnSelectedBackground;
}
}
public delegate void IsSelectedChangedEventHandler(object sender, DependencyPropertyChangedEventArgs e);
public event IsSelectedChangedEventHandler IsSelectedChanged;
private bool isSelected = false;
public bool IsSelected
{
get{return isSelected;}
set
{
if (isSelected != value)
{
isSelected = value;
IsSelectedChanged(this,new DependencyPropertyChangedEventArgs());
}
}
}
public new static DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached
(
"Background",
typeof(ImageSource),
typeof(Button)
);
public new ImageSource Background
{
get{ return (ImageSource)GetValue(BackgroundProperty);}
set { SetValue(BackgroundProperty, value); }
}
public static DependencyProperty TextColorProperty = DependencyProperty.RegisterAttached
(
"TextColor",
typeof(SolidColorBrush),
typeof(Button)
);
public SolidColorBrush TextColor
{
get { return (SolidColorBrush)GetValue(TextColorProperty); }
set { SetValue(TextColorProperty, value); }
}
public static DependencyProperty TextProperty = DependencyProperty.RegisterAttached
(
"Text",
typeof(string),
typeof(Button)
);
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public ImageSource SelectedBackground { get; set; }
public ImageSource UnSelectedBackground { get; set; }
public SolidColorBrush SelectedTextColor { get; set; }
public SolidColorBrush UnSelectedTextColor { get; set; }
}
其次是创建按钮模板:

<ControlTemplate TargetType="Button" x:Key="SelectButton">
<Grid Cursor="Hand">
<Image Source="{Binding Path=Background,RelativeSource={RelativeSource TemplatedParent}}"></Image>
<TextBlock FontFamily="微软雅黑" FontSize="24" Width="220" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" Text="{Binding Path=Text,RelativeSource={RelativeSource TemplatedParent}}" Foreground="{Binding Path=TextColor,RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="Wrap"></TextBlock>
</Grid>
</ControlTemplate>
<Grid Cursor="Hand">
<Image Source="{Binding Path=Background,RelativeSource={RelativeSource TemplatedParent}}"></Image>
<TextBlock FontFamily="微软雅黑" FontSize="24" Width="220" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" Text="{Binding Path=Text,RelativeSource={RelativeSource TemplatedParent}}" Foreground="{Binding Path=TextColor,RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="Wrap"></TextBlock>
</Grid>
</ControlTemplate>
最后就可以在后台中直接动态创建:

TextImageButton tbi = new TextImageButton()
{
Width = 280,
Height = 100,
Template = this.Resources["SelectButton"] as ControlTemplate,
Background = new BitmapImage(new Uri(@"/项目名称;component/Images/UnSelectButton.png", UriKind.Relative)),
SelectedBackground = new BitmapImage(new Uri(@"/项目名称;component/Images/SelectButton.png", UriKind.Relative)),
UnSelectedBackground = new BitmapImage(new Uri(@"/项目名称;component/Images/UnSelectButton.png", UriKind.Relative)),
TextColor = new SolidColorBrush(Color.FromRgb(51, 51, 51)),
SelectedTextColor = new SolidColorBrush(Color.FromRgb(255, 255, 255)),
UnSelectedTextColor = new SolidColorBrush(Color.FromRgb(51, 51, 51)),
Name = "按钮名称",
Text = "按钮内容"
};
{
Width = 280,
Height = 100,
Template = this.Resources["SelectButton"] as ControlTemplate,
Background = new BitmapImage(new Uri(@"/项目名称;component/Images/UnSelectButton.png", UriKind.Relative)),
SelectedBackground = new BitmapImage(new Uri(@"/项目名称;component/Images/SelectButton.png", UriKind.Relative)),
UnSelectedBackground = new BitmapImage(new Uri(@"/项目名称;component/Images/UnSelectButton.png", UriKind.Relative)),
TextColor = new SolidColorBrush(Color.FromRgb(51, 51, 51)),
SelectedTextColor = new SolidColorBrush(Color.FromRgb(255, 255, 255)),
UnSelectedTextColor = new SolidColorBrush(Color.FromRgb(51, 51, 51)),
Name = "按钮名称",
Text = "按钮内容"
};
变换按钮的状态通过 tbi.IsSelected = true 或 tbi.IsSelected = false 即可
分类:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架