WPF 关于界面UI菜单权限(或者任意控件的显示权限)的简单管理--只是简单简单简单简单

1.定义你的User类

cs 复制代码
 public class User
 {
     public User()
     {
         ID = ObjectId.NewObjectId().ToString();
     }
     public string? ID { get; set; }
     public string? Account { get; set; }
     public string? Password { get; set; }
     public string? PasswordMD5 { get; set; }
     public AccountType? AccountType { get;set; }
     public string? Name { get; set; }
     public string? CardNumer { get; set; }
     public string? Sex { get; set; }
     public DateTime? RegistrationTime { get; set; }
     public DateTime? LoginTime { get; set; }
     public string? Description { get; set; }
 }

2.定义你的权限类别

cs 复制代码
  public enum AccountType
  {
     None, Operator, Administrator, Developer,Master
  }

3.实现附加属性

cs 复制代码
internal class AccountManager
 {
     internal static HashSet<FrameworkElement> OnAccountTypeChangeToDoList = new HashSet<FrameworkElement>();
     internal static Action? Refresh { get; set; }
     internal static User? User { get => App.User; }
     internal static AccountType GetAccountType(DependencyObject obj)
     {
         return (AccountType)obj.GetValue(AccountTypeProperty);
     }

     internal static void SetAccountType(DependencyObject obj, AccountType value)
     {
         obj.SetValue(AccountTypeProperty, value);
     }


     internal static string GetGuid(DependencyObject obj)
     {
         return (string)obj.GetValue(GuidProperty);
     }

     internal static void SetGuid(DependencyObject obj, string value)
     {
         obj.SetValue(GuidProperty, value);
     }

     // Using a DependencyProperty as the backing store for Guid.  This enables animation, styling, binding, etc...
     internal static readonly DependencyProperty GuidProperty =
         DependencyProperty.RegisterAttached("Guid", typeof(string), typeof(AccountManager), new PropertyMetadata(""));


     // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
     internal static readonly DependencyProperty AccountTypeProperty =
         DependencyProperty.RegisterAttached("AccountType", typeof(AccountType), typeof(AccountManager), new PropertyMetadata(AccountType.None, OnAccountTypeChanged));

     private static void OnAccountTypeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
     {
         AccountType type = (AccountType)e.NewValue;
         var element = obj as FrameworkElement;
         if (element != null)
         {
             element.Visibility = User?.AccountType >=type ? Visibility.Visible : Visibility.Collapsed;
             if (!OnAccountTypeChangeToDoList.Contains(element))
             {
                 OnAccountTypeChangeToDoList.Add(element);
                 Refresh+= () =>
                 {
                     element.Visibility = User?.AccountType >= type ? Visibility.Visible : Visibility.Collapsed;
                 };
             }
         }
     }
 }

4.使用方法

XML 复制代码
<Window x:Class="Test.Windows.TestView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test.Windows"
        mc:Ignorable="d"  
        xmlns:Common="clr-namespace:Test.Common"
        Title="TestView" Height="450" Width="800">
    <StackPanel>
        <Button Content="用户按钮" Common:AccountManager.AccountType="Operator"/>
        <Button Content="管理员按钮" Common:AccountManager.AccountType="Administrator"/>
    </StackPanel>
</Window>

5.如果界面初始化之后,后台更改User类型之后可以调用Refresh实现刷新

cs 复制代码
   App.User?.Set(a => { a.AccountType = AccountType.Master; });
   AccountManager.Refresh?.Invoke();
相关推荐
默_笙11 分钟前
🍞 我用 CSS 画了一个会转的 3D 立方体,同事以为我学了 Three.js(这节课真的很神奇,我很喜欢)
javascript
sarasuki23 分钟前
JavaScript的对象、new的机制与原型包装类
javascript·后端
weedsfly27 分钟前
JavaScript 事件流:彻底搞懂捕获、冒泡与事件委托
前端·javascript·react.js
candyTong2 小时前
阿里开源 AI Code Review 工具:ocr review 的执行链路解析
javascript·后端·架构
铁皮饭盒2 小时前
TypeBox 比 Zod.js 校验 快10倍, 还兼容AI 工具调用, 他做对了什么?
前端·javascript·后端
To_OC11 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
kyriewen13 小时前
面试官问你:“AI 能写 80% 的代码了,公司为什么还需要你?”
前端·javascript·面试
Goodbye16 小时前
从 Token 到 Embedding:LLM 核心基础深度解析
javascript·人工智能
用户9385156350716 小时前
工具调用背后:LLM 如何突破“缸中大脑”,操控真实世界?
javascript·人工智能
Goodbye16 小时前
从函数到智能:LLM Tool Use 深度解析
javascript·人工智能