Files
Shrlalgo.RvKits/Melskin/Controls/Hyperlink.xaml.cs
2026-02-12 21:29:00 +08:00

82 lines
2.6 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.Diagnostics;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
namespace Melskin.Controls;
/// <summary>
/// A hyperlink button.
/// </summary>
public class Hyperlink : ButtonBase
{
#region Properties
/// <summary>
/// 已经浏览过的依赖属性。
/// </summary>
public bool IsVisited
{
get { return (bool)GetValue(IsVisitedProperty); }
// 外部无法直接赋值,只能读取
private set { SetValue(IsVisitedPropertyKey, value); }
}
/// <summary>
/// 定义私有的 Key这是“写入权限”的钥匙只有在这个类内部才能拿到
/// </summary>
public static readonly DependencyProperty IsVisitedProperty;
/// <summary>
/// 表示已经浏览过的依赖属性。
/// </summary>
public static readonly DependencyPropertyKey IsVisitedPropertyKey;
/// <summary>
/// 外部调用此方法来将超链接标记为已访问。
/// </summary>
public void MarkAsVisited()
{
SetValue(IsVisitedPropertyKey, true);
}
/// <summary>
/// 表示超链接地址的依赖属性。
/// </summary>
public static readonly DependencyProperty NavigateUriProperty =
DependencyProperty.Register(nameof(NavigateUri), typeof(string), typeof(Hyperlink), new PropertyMetadata(string.Empty));
/// <summary>
/// Gets or sets the uri of hyperlinks.
/// </summary>
public string NavigateUri { get => (string)GetValue(NavigateUriProperty);
set => SetValue(NavigateUriProperty, value);
}
#endregion
#region Constructors
static Hyperlink()
{
IsVisitedPropertyKey = DependencyProperty.RegisterReadOnly(nameof(IsVisited), typeof(bool), typeof(Hyperlink), new PropertyMetadata(false));
IsVisitedProperty = IsVisitedPropertyKey.DependencyProperty;
DefaultStyleKeyProperty.OverrideMetadata(typeof(Hyperlink), new FrameworkPropertyMetadata(typeof(Hyperlink)));
}
#endregion
/// <summary>
/// 点击后的事件
/// </summary>
/// <param name="e"></param>
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
if (string.IsNullOrEmpty(NavigateUri)) return;
try
{
// 1. 打开网页
Process.Start(new ProcessStartInfo(NavigateUri) { UseShellExecute = true });
// 2. 改变自身状态(这就是你作为控件的“记忆”)
SetValue(IsVisitedPropertyKey, true);
}
catch
{
// 忽略无效链接异常
}
}
}