81 lines
2.5 KiB
C#
81 lines
2.5 KiB
C#
using System.Diagnostics;
|
||
using System.Windows.Controls.Primitives;
|
||
using System.Windows.Input;
|
||
|
||
namespace VariaStudio.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 =
|
||
IsVisitedPropertyKey.DependencyProperty;
|
||
/// <summary>
|
||
/// 表示已经浏览过的依赖属性。
|
||
/// </summary>
|
||
public static readonly DependencyPropertyKey IsVisitedPropertyKey =
|
||
DependencyProperty.RegisterReadOnly(nameof(IsVisited), typeof(bool), typeof(Hyperlink), new PropertyMetadata(false));
|
||
/// <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()
|
||
{ 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
|
||
{
|
||
// 忽略无效链接异常
|
||
}
|
||
}
|
||
}
|