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();
相关推荐
weixin_419658314 分钟前
UISpy:Windows 界面控件的“显微镜“[特殊字符]
windows·python·测试工具·ui
大阳光男孩35 分钟前
ElementUI表格懒加载子级更新数据刷新不生效问题
前端·javascript·elementui
wy31362282138 分钟前
C#——意框架(结构说明)
前端·javascript·c#
研☆香44 分钟前
JS中的三种显示弹窗
开发语言·前端·javascript
猛扇赵四那边好嘴.1 小时前
Flutter 框架跨平台鸿蒙开发 - 问答社区应用开发教程
开发语言·javascript·flutter·华为·harmonyos
C_心欲无痕1 小时前
Next.js 路由系统对比:Pages Router vs App Router
开发语言·前端·javascript
hxjhnct1 小时前
JavaScript 的 new会发生什么
开发语言·javascript
狗都不学爬虫_1 小时前
JS逆向 - 最新版某某安全中心滑块验证(wasm设备指纹)
javascript·爬虫·python·网络爬虫·wasm
Jiangnan_Cai1 小时前
【Electron】Windows 下打包遇到 dist/unpacked 文件内 electron.exe 文件缺失问题
前端·javascript·electron
自不量力的A同学1 小时前
Electron 40.0.0 发布,跨平台桌面应用开发工具
前端·javascript·electron