私はMahAppsフレームワークを使用しており、MouseOverでタイルを強調表示するスタイル(How to change tile background on mouse over in WPF?を参照)があります。マウスオーバーでタイルの背景色を明るく/暗くするには?
<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));
}
}
は基本的に、私のことができるようにしたい:
- は、デザイナビューでタイルの背景を設定します。 DONE
- このスタイルをタイルに適用します。ランタイム中にMouseOverでその背景が黒くなる(タイルを強調表示する)ようにし、マウスがタイルを持っているときに初期カラーに戻ります(ホストコントロールの背景はこのロジックに影響しません)。 NEED HELPの
私のコードは、私は、スタイル(この場合は、「パープル」)で非強調表示の背景色を設定している場合にのみ機能します。この色をスタイルに設定しないと(最初の行を削除すると)、コードは、タイルのデフォルトの青色の背景色でのみ機能します(MainWindow.xamlで色を設定した場合、コンバータはトリガーされません。ブレークポイントを使用して)。当初はこのバインディングを使用しましたが、うまくいきませんでした。
<Setter Property="Background" Value="{Binding Path=Background.Color, RelativeSource={RelativeSource Self}}" />
私は間違っていますか?それとも、私は実際に達成可能なことを求めているのですか?
私はMahAppsをよく知っているわけではありませんが、targettypeは一般的に 'TargetType =" controls:Tile "に近いものではありません。また、値バインディングには、親戚だけでなく、バックグラウンドに。カラー? –
@ChrisW。 TargetTypeは、コントロールとコントロールの両方で動作します。タイル。私はこれを試しましたが、動作しません: タイルコードは次のとおりです。 上記の私のコードは、最初のSetter Propertyを除き、明示的にタイルの背景色を設定しない場合にのみ機能します。 –
@jstreetありがとうございました!しかし、私はこのコードは、私はタイルの背景色を設定しない場合にのみ動作することに気づいた。私はデフォルトの青色を残しても動作しますが、背景色(MainWindow.xaml内)、例えば 'Background =" Purple "'を設定してもコンバータを起動しません(ブレークポイントを使って検証します)。 –