初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Markup;
|
||||
using PCL.Core.App;
|
||||
using PCL.Core.App.Configuration;
|
||||
using PCL.Core.UI.Theme;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace PCL;
|
||||
|
||||
[ContentProperty("Inlines")]
|
||||
public partial class MyHint
|
||||
{
|
||||
// 配色
|
||||
public enum Themes
|
||||
{
|
||||
Blue = 0,
|
||||
Red = 1,
|
||||
Yellow = 2
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty IsWarnProperty = DependencyProperty.Register("IsWarn", typeof(bool),
|
||||
typeof(MyHint),
|
||||
new PropertyMetadata(true,
|
||||
(d, e) =>
|
||||
{
|
||||
var f = (MyHint)d;
|
||||
f.Theme = e.NewValue is not null ? Themes.Red : Themes.Blue;
|
||||
}));
|
||||
|
||||
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string),
|
||||
typeof(MyHint), new PropertyMetadata("", (d, e) =>
|
||||
{
|
||||
var f = (MyHint)d;
|
||||
f.LabText.Text = (string)e.NewValue;
|
||||
}));
|
||||
|
||||
// 触发点击事件
|
||||
private bool isMouseDown;
|
||||
public int Uuid = ModBase.GetUuid();
|
||||
|
||||
public MyHint()
|
||||
{
|
||||
InitializeComponent();
|
||||
UpdateUI();
|
||||
Loaded += (_, _) => UpdateUI();
|
||||
Loaded += MyHint_Loaded;
|
||||
MouseLeftButtonUp += MyHint_MouseUp;
|
||||
MouseLeftButtonDown += MyHint_MouseDown;
|
||||
MouseLeave += (_, _) => MyHint_MouseLeave();
|
||||
Unloaded += (_, _) => Dispose();
|
||||
}
|
||||
|
||||
// 边框
|
||||
public bool HasBorder
|
||||
{
|
||||
get => BorderThickness.Top > 0d;
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
BorderThickness = new Thickness(3d, ModBase.GetWPFSize(1d), ModBase.GetWPFSize(1d), ModBase.GetWPFSize(1d));
|
||||
else
|
||||
BorderThickness = new Thickness(3d, 0d, 0d, 0d);
|
||||
}
|
||||
}
|
||||
|
||||
public Themes Theme
|
||||
{
|
||||
get => field;
|
||||
set
|
||||
{
|
||||
field = value;
|
||||
UpdateUI();
|
||||
}
|
||||
} = Themes.Red;
|
||||
|
||||
[Obsolete("IsWarn 已过时。请换用 Theme 属性。")]
|
||||
public bool IsWarn
|
||||
{
|
||||
get => Theme == Themes.Red;
|
||||
set => Theme = value ? Themes.Red : Themes.Blue;
|
||||
}
|
||||
|
||||
// 文本
|
||||
public InlineCollection Inlines => LabText.Inlines;
|
||||
|
||||
public string Text
|
||||
{
|
||||
get => (string)GetValue(TextProperty);
|
||||
set => SetValue(TextProperty, value);
|
||||
}
|
||||
|
||||
// 关闭按钮
|
||||
public bool CanClose
|
||||
{
|
||||
get => BtnClose.Visibility == Visibility.Visible;
|
||||
set => BtnClose.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
public string RelativeSetup { get; set; } = "";
|
||||
|
||||
private void UpdateUI()
|
||||
{
|
||||
var hue = default(double);
|
||||
switch (Theme)
|
||||
{
|
||||
case Themes.Blue:
|
||||
{
|
||||
hue = 210d;
|
||||
break;
|
||||
}
|
||||
case Themes.Red:
|
||||
{
|
||||
hue = 355d;
|
||||
break;
|
||||
}
|
||||
case Themes.Yellow:
|
||||
{
|
||||
hue = 40d;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var s = ThemeService.CurrentTone;
|
||||
Background = new ModBase.MyColor().FromHSL2(hue, 90, s.L7 * 100);
|
||||
BorderBrush = new ModBase.MyColor().FromHSL2(hue, 90, s.L2 * 100);
|
||||
LabText.Foreground = new ModBase.MyColor().FromHSL2(hue, 90, s.L2 * 100);
|
||||
BtnClose.Foreground = new ModBase.MyColor().FromHSL2(hue, 90, s.L2 * 100);
|
||||
|
||||
// 根据提示气泡对齐方向刷新边框
|
||||
// 此处依赖 HasBorder 的副作用进行范围检查
|
||||
HasBorder = HasBorder;
|
||||
}
|
||||
|
||||
private void MyHint_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ThemeService.ColorModeChanged += (v, theme) => _ThemeChanged(v, theme);
|
||||
if (CanClose && ConfigService.TryGetConfigItemNoType(RelativeSetup, out var item) && item.GetValueNoType() is not null)
|
||||
Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
private void BtnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (ConfigService.TryGetConfigItemNoType(RelativeSetup, out var item))
|
||||
item.SetValueNoType(true);
|
||||
ModAnimation.AniDispose(this, false);
|
||||
}
|
||||
|
||||
private void MyHint_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!isMouseDown)
|
||||
return;
|
||||
isMouseDown = false;
|
||||
ModBase.Log("[Control] 按下提示条" + (string.IsNullOrEmpty(Name) ? "" : ":" + Name));
|
||||
e.Handled = true;
|
||||
ModMain.RaiseCustomEvent(this);
|
||||
}
|
||||
|
||||
private void MyHint_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
isMouseDown = true;
|
||||
}
|
||||
|
||||
private void MyHint_MouseLeave()
|
||||
{
|
||||
isMouseDown = false;
|
||||
}
|
||||
|
||||
private void _ThemeChanged(bool isDarkMode, ColorTheme theme)
|
||||
{
|
||||
UpdateUI();
|
||||
}
|
||||
|
||||
private void Dispose()
|
||||
{
|
||||
ThemeService.ColorModeChanged -= _ThemeChanged;
|
||||
}
|
||||
}
|
||||
|
||||
public static partial class ModAnimation
|
||||
{
|
||||
public static void AniDispose(MyHint control, bool removeFromChildren, ParameterizedThreadStart callBack = null)
|
||||
{
|
||||
if (!control.IsHitTestVisible)
|
||||
return;
|
||||
control.IsHitTestVisible = false;
|
||||
AniStart(new[]
|
||||
{
|
||||
AaScaleTransform(control, -0.08d, 200, ease: new AniEaseInFluent()),
|
||||
AaOpacity(control, -1, 200, ease: new AniEaseOutFluent()),
|
||||
AaHeight(control, -control.ActualHeight, 150, 100, new AniEaseOutFluent()),
|
||||
AaCode(() =>
|
||||
{
|
||||
if (removeFromChildren)
|
||||
((Panel)control.Parent).Children.Remove(control);
|
||||
else
|
||||
control.Visibility = Visibility.Collapsed;
|
||||
if (callBack is not null)
|
||||
callBack(control);
|
||||
}, after: true)
|
||||
}, "MyCard Dispose " + control.Uuid);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user