1.为button模板增加触发器:
<ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" TargetName="border"> <Setter.Value> <MultiBinding Converter="{StaticResource mouseOverColorConverter}"> <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="MouseOverBackground" ></Binding> <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="Background" ></Binding> </MultiBinding> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" TargetName="border" > <Setter.Value> <MultiBinding Converter="{StaticResource pressColorConverter}"> <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="PressedBackground" ></Binding> <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="Background" ></Binding> </MultiBinding> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers>
2.增加多值转换器:
public class PressColorConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if ((values[0] as SolidColorBrush).Color == Colors.Blue)//默认蓝色则自动生成 { var c = System.Drawing.ColorTranslator.FromHtml(values[1].ToString()); var c1 = StaticFunc.ChangeColor(c, -0.2f); return new SolidColorBrush(Color.FromArgb(c1.A, c1.R, c1.G, c1.B)); } else { return values[0]; } } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class MouseOverColorConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if ((values[0] as SolidColorBrush).Color == Colors.Blue) { var c = System.Drawing.ColorTranslator.FromHtml(values[1].ToString()); var c1 = StaticFunc.ChangeColor(c, -0.1f); return new SolidColorBrush(Color.FromArgb(c1.A, c1.R, c1.G, c1.B)); } else { return values[0]; } } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
3.颜色转换函数:
public class StaticFunc { public static Color ChangeColor(Color color, float correctionFactor) { float red = (float)color.R; float green = (float)color.G; float blue = (float)color.B; if (correctionFactor < 0) { correctionFactor = 1 + correctionFactor; red *= correctionFactor; green *= correctionFactor; blue *= correctionFactor; } else { red = (255 - red) * correctionFactor + red; green = (255 - green) * correctionFactor + green; blue = (255 - blue) * correctionFactor + blue; } if (red < 0) red = 0; if (red > 255) red = 255; if (green < 0) green = 0; if (green > 255) green = 255; if (blue < 0) blue = 0; if (blue > 255) blue = 255; return Color.FromArgb(color.A, (int)red, (int)green, (int)blue); } }