XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.WinUIHelper

【DLL】WinUI的各种工具类,帮助开发者快速构建一个模块化的WinUI项目

公开
关注 0 Fork 0 Star 0
UTF-8
using Microsoft.UI.Xaml.Media;
using XFEExtension.NetCore.WinUIHelper.Utilities.Additions;

namespace XFEExtension.NetCore.WinUIHelper.Utilities.Helpers;

/// <summary>
/// 权限帮助类
/// </summary>
public static class PermissionHelper
{
    /// <summary>
    /// 设置可见性
    /// </summary>
    /// <param name="uIElement"></param>
    /// <param name="currentPermission"></param>
    public static void SetVisibility(UIElement uIElement, int currentPermission) => uIElement.Visibility = PermissionAddition.GetRequiredPermission(uIElement) <= currentPermission ? Visibility.Visible : Visibility.Collapsed;

    /// <summary>
    /// 设置可见性
    /// </summary>
    /// <param name="menuItems"></param>
    /// <param name="currentPermission"></param>
    public static void SetVisibility(IList<object> menuItems, int currentPermission)
    {
        foreach (var menuItem in menuItems.OfType<NavigationViewItem>())
        {
            SetVisibility(menuItem, currentPermission);
            if (menuItem.MenuItems.Count > 0)
            {
                SetVisibility(menuItem.MenuItems, currentPermission);
            }
        }
    }

    /// <summary>
    /// 设置子节点可见性
    /// </summary>
    /// <param name="parent"></param>
    /// <param name="currentPermission"></param>
    public static void SetChildVisibility(UIElement parent, int currentPermission)
    {
        foreach (var child in FindElementsWithAttachedProperty(parent, PermissionAddition.RequiredPermissionProperty))
        {
            SetVisibility(child, currentPermission);
        }
    }

    /// <summary>
    /// 寻找带有指定附加属性的控件
    /// </summary>
    /// <param name="parent"></param>
    /// <param name="attachedProperty"></param>
    /// <returns></returns>
    public static IEnumerable<UIElement> FindElementsWithAttachedProperty(UIElement parent, DependencyProperty attachedProperty)
    {
        if (parent is null)
            yield break;
        int count = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            if (child is UIElement uIElement)
            {
                var value = uIElement.GetValue(attachedProperty);
                var metadata = attachedProperty.GetMetadata(uIElement.GetType());
                if (!Equals(value, metadata.DefaultValue))
                {
                    yield return uIElement;
                }
                foreach (var descendant in FindElementsWithAttachedProperty(uIElement, attachedProperty))
                {
                    yield return descendant;
                }
            }
        }
    }
}