Files
MRCC/launcher/PCL-CE/Plain Craft Launcher 2/Controls/MyHint.xaml.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

204 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}