CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
145 lines
4.4 KiB
C#
145 lines
4.4 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Media;
|
|
using System.Windows.Shapes;
|
|
using PCL.Core.App;
|
|
using PCL.Core.UI.Controls.SvgIcon;
|
|
|
|
namespace PCL;
|
|
|
|
public class MyMenuItem : MenuItem
|
|
{
|
|
// 指向动画
|
|
|
|
private const int AnimationTimeIn = 100;
|
|
private const int AnimationTimeOut = 200;
|
|
|
|
public static readonly DependencyProperty SvgIconProperty = DependencyProperty.Register(
|
|
nameof(SvgIcon),
|
|
typeof(string),
|
|
typeof(MyMenuItem),
|
|
new PropertyMetadata(string.Empty, OnSvgIconChanged));
|
|
|
|
private SvgIcon? _svgIconControl;
|
|
private string _colorName;
|
|
|
|
// 基础
|
|
|
|
public int Uuid = ModBase.GetUuid();
|
|
|
|
public MyMenuItem()
|
|
{
|
|
Loaded += MyMenuItem_Loaded;
|
|
MouseEnter += (_, _) => RefreshColor();
|
|
MouseLeave += (_, _) => RefreshColor();
|
|
IsEnabledChanged += (_, _) => RefreshColor();
|
|
}
|
|
|
|
public string SvgIcon
|
|
{
|
|
get => (string)GetValue(SvgIconProperty);
|
|
set => SetValue(SvgIconProperty, value);
|
|
}
|
|
|
|
private static void OnSvgIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
if (d is MyMenuItem { IsLoaded: true } item)
|
|
item.UpdateTemplateIcon();
|
|
}
|
|
|
|
private (string BackName, string ForeName, int Time) GetVisualState()
|
|
{
|
|
if (!IsEnabled)
|
|
return ("ColorBrushTransparent", "ColorBrushGray5", AnimationTimeOut);
|
|
if (IsMouseOver)
|
|
return ("ColorBrush6", "ColorBrush2", AnimationTimeIn);
|
|
return ("ColorBrushTransparent", "ColorBrush1", AnimationTimeOut);
|
|
}
|
|
|
|
private void MyMenuItem_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
UpdateTemplateIcon();
|
|
((ContextMenu)Parent).Opacity = Config.Preference.Theme.WindowOpacity / 1000.0 + 0.4;
|
|
}
|
|
|
|
private void UpdateTemplateIcon()
|
|
{
|
|
var iconControl = (Path)GetTemplateChild("Icon");
|
|
if (iconControl is null)
|
|
return;
|
|
|
|
if (SvgIconControlHelper.HasSvgIcon(SvgIcon))
|
|
{
|
|
iconControl.Visibility = Visibility.Collapsed;
|
|
EnsureSvgIconControl(iconControl);
|
|
_svgIconControl!.Icon = SvgIcon;
|
|
_svgIconControl.Visibility = Visibility.Visible;
|
|
return;
|
|
}
|
|
|
|
_svgIconControl?.Visibility = Visibility.Collapsed;
|
|
if (Icon is null) return;
|
|
|
|
iconControl.Visibility = Visibility.Visible;
|
|
iconControl.Data = (Geometry)new GeometryConverter().ConvertFromString(Icon.ToString());
|
|
}
|
|
|
|
private void EnsureSvgIconControl(Path iconControl)
|
|
{
|
|
if (_svgIconControl is not null)
|
|
return;
|
|
|
|
_svgIconControl = new SvgIcon
|
|
{
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
Stretch = Stretch.Uniform,
|
|
Margin = iconControl.Margin,
|
|
Height = iconControl.Height,
|
|
Width = iconControl.Width,
|
|
IsHitTestVisible = false,
|
|
Visibility = Visibility.Collapsed
|
|
};
|
|
_svgIconControl.SetBinding(Core.UI.Controls.SvgIcon.SvgIcon.IconBrushProperty,
|
|
new Binding(nameof(Foreground)) { Source = this });
|
|
|
|
if (VisualTreeHelper.GetParent(iconControl) is not Grid grid) return;
|
|
|
|
Grid.SetColumn(_svgIconControl, Grid.GetColumn(iconControl));
|
|
Grid.SetRow(_svgIconControl, Grid.GetRow(iconControl));
|
|
grid.Children.Add(_svgIconControl);
|
|
}
|
|
|
|
private void RefreshColor()
|
|
{
|
|
var (backName, foreName, time) = GetVisualState();
|
|
|
|
// 重复性验证
|
|
if ((_colorName ?? "") == (backName ?? ""))
|
|
return;
|
|
_colorName = backName;
|
|
// 触发颜色动画
|
|
if (IsLoaded && ModAnimation.AniControlEnabled == 0) // 防止默认属性变更触发动画
|
|
{
|
|
// 有动画
|
|
ModAnimation.AniStart(
|
|
new[]
|
|
{
|
|
ModAnimation.AaColor(this, BackgroundProperty, backName, time),
|
|
ModAnimation.AaColor(this, ForegroundProperty, foreName, time)
|
|
}, "MyMenuItem Color " + Uuid);
|
|
}
|
|
else
|
|
{
|
|
// 无动画
|
|
ModAnimation.AniStop("MyMenuItem Color " + Uuid);
|
|
SetResourceReference(BackgroundProperty, backName);
|
|
SetResourceReference(ForegroundProperty, foreName);
|
|
}
|
|
}
|
|
|
|
private void MyMenuItem_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ModMain.RaiseCustomEvent(this);
|
|
}
|
|
} |