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();
相关推荐
子兮曰3 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
百锦再3 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
暖馒5 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
颜酱5 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
失忆爆表症5 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录5 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜6 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
不爱吃糖的程序媛6 小时前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter
利刃大大6 小时前
【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
前端·javascript·vue.js·element-plus