100 lines
2.8 KiB
C#
100 lines
2.8 KiB
C#
using System.Windows;
|
|||
|
|
using System.Windows.Controls;
|
||
|
|
using System.Windows.Input;
|
||
|
|
|
||
|
|
namespace PCL;
|
||
|
|
|
||
|
|
public class MyComboBoxItem : ComboBoxItem
|
||
|
|
{
|
||
|
|
// 指向动画
|
||
|
|
|
||
|
|
private const int animationTimeIn = 100;
|
||
|
|
private const int animationTimeOut = 300;
|
||
|
|
private string backColorName;
|
||
|
|
private double fontOpacity;
|
||
|
|
|
||
|
|
// 基础
|
||
|
|
|
||
|
|
public int Uuid = ModBase.GetUuid();
|
||
|
|
|
||
|
|
public MyComboBoxItem()
|
||
|
|
{
|
||
|
|
Style = (Style)FindResource("MyComboBoxItem");
|
||
|
|
Unselected += (_, _) => RefreshColor();
|
||
|
|
MouseMove += (_, _) => RefreshColor();
|
||
|
|
MouseLeave += (_, _) => RefreshColor();
|
||
|
|
Selected += (_, _) => RefreshColor();
|
||
|
|
IsEnabledChanged += (_, _) => RefreshColor();
|
||
|
|
MouseLeftButtonUp += MyComboBoxItem_MouseLeftButtonUp;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void RefreshColor()
|
||
|
|
{
|
||
|
|
// 判断当前颜色
|
||
|
|
string newBackColorName;
|
||
|
|
double newFontOpacity;
|
||
|
|
int time;
|
||
|
|
if (IsSelected)
|
||
|
|
{
|
||
|
|
newBackColorName = "ColorBrush6";
|
||
|
|
newFontOpacity = 1d;
|
||
|
|
time = animationTimeIn;
|
||
|
|
}
|
||
|
|
else if (IsMouseOver)
|
||
|
|
{
|
||
|
|
newBackColorName = "ColorBrush8";
|
||
|
|
newFontOpacity = 1d;
|
||
|
|
time = animationTimeIn;
|
||
|
|
}
|
||
|
|
else if (IsEnabled)
|
||
|
|
{
|
||
|
|
newBackColorName = "ColorBrushTransparent";
|
||
|
|
newFontOpacity = 1d;
|
||
|
|
time = animationTimeOut;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
newBackColorName = "ColorBrushTransparent";
|
||
|
|
newFontOpacity = 0.4d;
|
||
|
|
time = animationTimeOut;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((backColorName ?? "") == (newBackColorName ?? "") && fontOpacity == newFontOpacity)
|
||
|
|
return;
|
||
|
|
backColorName = newBackColorName;
|
||
|
|
fontOpacity = newFontOpacity;
|
||
|
|
// 触发颜色动画
|
||
|
|
if (IsLoaded && ModAnimation.AniControlEnabled == 0) // 防止默认属性变更触发动画
|
||
|
|
{
|
||
|
|
// 有动画
|
||
|
|
ModAnimation.AniStart(
|
||
|
|
new[]
|
||
|
|
{
|
||
|
|
ModAnimation.AaColor(this, BackgroundProperty, backColorName, time),
|
||
|
|
ModAnimation.AaOpacity(this, fontOpacity - Opacity, time)
|
||
|
|
}, "ComboBoxItem Color " + Uuid);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// 无动画
|
||
|
|
ModAnimation.AniStop("ComboBoxItem Color " + Uuid);
|
||
|
|
SetResourceReference(BackgroundProperty, backColorName);
|
||
|
|
Opacity = fontOpacity;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public override string ToString()
|
||
|
|
{
|
||
|
|
return Content?.ToString() ?? "";
|
||
|
|
}
|
||
|
|
|
||
|
|
public static implicit operator string(MyComboBoxItem value)
|
||
|
|
{
|
||
|
|
return value.Content?.ToString() ?? "";
|
||
|
|
}
|
||
|
|
|
||
|
|
private void MyComboBoxItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||
|
|
{
|
||
|
|
ModBase.Log("[Control] 选择下拉列表项:" + ToString());
|
||
|
|
}
|
||
|
|
}
|