如果要转载请注明来出处(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 即可