如何使鼠标上的平铺背景颜色变亮/变暗?

时间:2016-04-18 14:07:57

标签: c# wpf xaml tile mahapps.metro

我正在使用MahApps框架,我有样式(请参阅How to change tile background on mouse over in WPF?)以突出显示MouseOver上的图块。

 <local:ColorConverter x:Key="colorConverter" />
 <Style x:Key="highlightedTile" TargetType="mah:Tile">
     <Setter Property="Background" Value="Purple" />
     <Style.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
             <Setter Property="Background" Value="{Binding Path=Background, RelativeSource={RelativeSource Self}, Converter={StaticResource colorConverter}, Mode=OneTime, FallbackValue=red}" />
         </Trigger>
     </Style.Triggers>
 </Style>

颜色转换器代码为:

class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        byte[] temp = StringToByteArray(value.ToString().Substring(1, 8)); // Remove #
        Color color = Color.FromArgb(temp[0], temp[1], temp[2], temp[3]);
        System.Drawing.Color darkColor = System.Windows.Forms.ControlPaint.Dark(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B), 0.1f);
        return new SolidColorBrush(Color.FromArgb(darkColor.A, darkColor.R, darkColor.G, darkColor.B));
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public static byte[] StringToByteArray(string hex)
    {
        if (hex.Length % 2 == 1)
            throw new Exception("The binary key cannot have an odd number of digits");

        byte[] arr = new byte[hex.Length >> 1];

        for (int i = 0; i < hex.Length >> 1; ++i)
        {
            arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
        }

        return arr;
    }

    public static int GetHexVal(char hex)
    {
        int val = (int)hex;
        //For uppercase A-F letters:
        return val - (val < 58 ? 48 : 55);
        //For lowercase a-f letters:
        //return val - (val < 58 ? 48 : 87);
        //Or the two combined, but a bit slower:
        //return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
    }
}

基本上,我希望能够:

  1. 在设计器视图中设置tile的背景; DONE
  2. 然后将此样式应用于图块; DONE
  3. 在运行时,在MouseOver上看到它的背景变暗(突出显示图块)并在鼠标存在时返回到初始颜色图块(主机控件的背景不应影响此逻辑)。 需要帮助
  4. 我的代码仅在我在样式中设置非突出显示的背景颜色时才有效(在这种情况下,&#34;紫色&#34;)。如果没有在样式中设置此颜色(删除第一行),代码仅适用于图块的默认蓝色背景颜色(如果我在MainWindow.xaml中设置颜色,则转换器甚至不会被触发,我使用断点验证了。最初我使用了这个绑定,但不起作用:

    <Setter Property="Background" Value="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" />
    

    我做错了什么?或者这是我要求实际可以实现的目标?

1 个答案:

答案 0 :(得分:0)

我建议你覆盖Tile的样式,并在ControlTemplate触发器上使用你的转换器。

enter image description here

以下XAML源可以使用最新的MahApps源代码,也可以通过NuGet(预发行版)获得。

Cannot convert 17/04/16 00:00 of type class java.util.Date to class java.sql.Date

希望有所帮助!