2026-01-02 17:30:41 +08:00
|
|
|
|
namespace Melskin.Assists;
|
2025-08-20 12:10:13 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// TabAssist 类用于在 WPF 应用程序中为 TabControl 提供附加功能。通过依赖属性 UseFadeIn,可以控制选项卡切换时是否启用渐变浮现效果。
|
|
|
|
|
|
/// 该类扩展了 DependencyObject,因此能够支持数据绑定和样式设置。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class TabAssist
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取指定依赖对象是否启用渐变浮现效果。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="obj">要获取渐变浮现效果设置的依赖对象。</param>
|
|
|
|
|
|
/// <returns>如果依赖对象启用了渐变浮现效果,则返回 true;否则返回 false。</returns>
|
|
|
|
|
|
public static bool GetUseFadeIn(DependencyObject obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
return (bool)obj.GetValue(UseFadeInProperty);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置指定依赖对象是否启用渐变浮现效果。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="obj">要设置 UseFadeIn 属性的 DependencyObject。</param>
|
|
|
|
|
|
/// <param name="value">如果为 true,则启用渐变浮现效果;否则,禁用该效果。</param>
|
|
|
|
|
|
public static void SetUseFadeIn(DependencyObject obj, bool value)
|
|
|
|
|
|
{
|
|
|
|
|
|
obj.SetValue(UseFadeInProperty, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// UseFadeInProperty 是一个依赖属性,用于控制 TabControl 在选项卡切换时是否启用渐变浮现效果。通过设置此属性为 true 或 false,可以开启或关闭该视觉效果。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static readonly DependencyProperty UseFadeInProperty =
|
|
|
|
|
|
DependencyProperty.RegisterAttached("UseFadeIn",
|
|
|
|
|
|
typeof(bool), typeof(TabAssist),
|
|
|
|
|
|
new PropertyMetadata(false, OnUseFadeInChanged));
|
|
|
|
|
|
|
|
|
|
|
|
//切换选项卡时使用渐变浮现效果
|
|
|
|
|
|
private static void OnUseFadeInChanged(DependencyObject d,
|
|
|
|
|
|
DependencyPropertyChangedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
var tabControl = (TabControl)d;
|
|
|
|
|
|
if (!(bool)e.OldValue && (bool)e.NewValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
tabControl.SelectionChanged += TabControl_FadeInEffect;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ((bool)e.OldValue && !(bool)e.NewValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
tabControl.SelectionChanged -= TabControl_FadeInEffect;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static void TabControl_FadeInEffect(object sender, SelectionChangedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
var tabControl = (TabControl)sender;
|
|
|
|
|
|
//判断是子控件消息还是Tab消息
|
|
|
|
|
|
if (e.Source.GetType() == typeof(TabControl)) return;
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
|
//继续向父级传递
|
|
|
|
|
|
if (tabControl.Parent is not UIElement tabParent) return;
|
|
|
|
|
|
var selectionEventArg =
|
|
|
|
|
|
new SelectionChangedEventArgs(e.RoutedEvent, e.RemovedItems, e.AddedItems)
|
|
|
|
|
|
{
|
|
|
|
|
|
Source = e.OriginalSource
|
|
|
|
|
|
};
|
|
|
|
|
|
tabParent.RaiseEvent(selectionEventArg);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// TabTypeProperty 是一个依赖属性,用于指定 TabControl 中选项卡的样式类型。通过设置此属性为不同的 TabType 枚举值(如 Line 或 Card),可以改变选项卡的外观以适应多样化的用户界面设计需求。默认情况下,该属性被设置为 TabType.Line。
|
|
|
|
|
|
/// </summary>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static readonly DependencyProperty TabTypeProperty =
|
|
|
|
|
|
DependencyProperty.RegisterAttached(
|
|
|
|
|
|
"TabType",
|
|
|
|
|
|
typeof(TabType),
|
|
|
|
|
|
typeof(TabAssist),
|
|
|
|
|
|
new PropertyMetadata(TabType.Line)); // 默认值为 Line
|
|
|
|
|
|
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置指定依赖对象的选项卡类型。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="element">要设置选项卡类型的依赖对象。</param>
|
|
|
|
|
|
/// <param name="value">要设置的选项卡类型,可以是 Line 或 Card。</param>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static void SetTabType(DependencyObject element, TabType value)
|
|
|
|
|
|
{
|
|
|
|
|
|
element.SetValue(TabTypeProperty, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取指定依赖对象的选项卡类型。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="element">要获取选项卡类型的依赖对象。</param>
|
|
|
|
|
|
/// <returns>返回依赖对象的选项卡类型,可以是 Line 或 Card。</returns>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static TabType GetTabType(DependencyObject element)
|
|
|
|
|
|
{
|
|
|
|
|
|
return (TabType)element.GetValue(TabTypeProperty);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 注册 IsEditable 附加属性
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// IsEditableProperty 是一个依赖属性,用于控制 TabControl 的选项卡是否可编辑。通过设置此属性为 true 或 false,可以开启或关闭选项卡的编辑功能。
|
|
|
|
|
|
/// </summary>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static readonly DependencyProperty IsEditableProperty =
|
|
|
|
|
|
DependencyProperty.RegisterAttached(
|
|
|
|
|
|
"IsEditable",
|
|
|
|
|
|
typeof(bool),
|
|
|
|
|
|
typeof(TabAssist),
|
|
|
|
|
|
new PropertyMetadata(false));
|
|
|
|
|
|
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置指定依赖对象的选项卡是否可编辑。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="element">要设置 IsEditable 属性的 DependencyObject。</param>
|
|
|
|
|
|
/// <param name="value">如果为 true,则启用选项卡编辑功能;否则,禁用该功能。</param>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static void SetIsEditable(DependencyObject element, bool value)
|
|
|
|
|
|
{
|
|
|
|
|
|
element.SetValue(IsEditableProperty, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取指定依赖对象的选项卡是否可编辑。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="element">要获取选项卡编辑状态的依赖对象。</param>
|
|
|
|
|
|
/// <returns>如果选项卡可编辑,则返回 true;否则返回 false。</returns>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public static bool GetIsEditable(DependencyObject element)
|
|
|
|
|
|
{
|
|
|
|
|
|
return (bool)element.GetValue(IsEditableProperty);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-20 12:10:35 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// TabType 枚举定义了在 WPF 应用程序中 TabControl 可以使用的不同类型的选项卡样式。此枚举支持两种主要的选项卡风格:Line 和 Card,分别代表线型和卡片式布局。
|
|
|
|
|
|
/// 通过设置此枚举值,开发者可以轻松地改变选项卡的外观以适应不同的用户界面设计需求。
|
|
|
|
|
|
/// </summary>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
public enum TabType
|
|
|
|
|
|
{
|
2025-08-20 12:10:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 表示选项卡类型为线型。当 TabControl 的 TabType 属性设置为此值时,表示选项卡将以线条形式显示。
|
|
|
|
|
|
/// </summary>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
Line, // 默认线条样式
|
2025-08-20 12:10:35 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
///
|
|
|
|
|
|
/// </summary>
|
2025-08-20 12:10:13 +08:00
|
|
|
|
Card // 卡片样式
|
|
|
|
|
|
}
|