Ich benutze MahApps Framework und ich habe den Stil (siehe How to change tile background on mouse over in WPF?) zum Hervorheben einer Kachel auf MouseOver.How To Lighten/Darken Kachelhintergrundfarbe auf Mouse Over?
<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>
Der Farbkonverter-Code ist:
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));
}
}
Grundsätzlich möchte ich in der Lage sein:
- setzen den Hintergrund der Fliese in der Entwurfsansicht; DONE
- dann wenden Sie diesen Stil auf die Kachel; FERTIG
- während der Laufzeit auf MouseOver, um zu sehen, dass der Hintergrund dunkler wird (Hervorhebung der Kachel) und zur Ausgangsfarbe zurückkehrt, wenn die Maus die Kachel enthält (der Hintergrund des Host-Steuerelements sollte diese Logik nicht beeinflussen). NEED
Mein Code HELP funktioniert nur, wenn ich die nicht-markierte Hintergrundfarbe im Stil (in diesem Fall "Purple") gesetzt. Ohne diese Farbe im Stil zu setzen (die erste Zeile zu entfernen), funktioniert der Code nur mit der blauen Standardhintergrundfarbe der Kachel (wenn ich die Farbe in MainWindow.xaml einstelle, wird der Konverter nicht einmal ausgelöst, was ich verifiziert habe einen Haltepunkt verwenden). Anfangs habe ich diese Bindung verwendet, funktioniert aber nicht:
<Setter Property="Background" Value="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" />
Was mache ich falsch? Oder ist es das, worum ich eigentlich bitten möchte?
Ich bin nicht sehr vertraut mit MahApps, aber würde nicht targettype in der Regel etwas näher an "TargetType =" steuert: Tile "' und die Wertbindung erfordern keine Verwandtenquelle, sowie die Eigenschaft nur Hintergrund im Gegensatz zum Hintergrund.Farbe? –
@ChrisW. TargetType funktioniert sowohl mit Control als auch mit Controls: Tile. Ich habe es versucht, funktioniert aber nicht: . Der Kachelcode lautet: . Mein Code oben, außer der ersten Setter-Eigenschaft, funktioniert nur, wenn ich nicht explizit eine Kachelhintergrundfarbe einstelle. –
@jstreet Danke! Allerdings habe ich festgestellt, dass dieser Code nur funktioniert, wenn ich keine Kachelhintergrundfarbe einstelle. Wenn ich die blaue Standardfarbe belasse, funktioniert es, aber wenn ich eine Hintergrundfarbe (in MainWindow.xaml) einstelle, z. B. "Background =" Purple "", löst es nicht einmal den Konverter aus (überprüft mit einem Breakpoint). –