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();
相关推荐
冰茶_18 分钟前
WPF TextBlock控件性能优化指南
学习·性能优化·wpf·控件
Jedi Hongbin1 小时前
echarts自定义图表--仪表盘
前端·javascript·echarts
边洛洛1 小时前
对Electron打包的exe文件进行反解析
前端·javascript·electron
晴殇i1 小时前
一行代码搞定防抖节流:JavaScript新特性解析
前端·javascript
2501_915373881 小时前
怎样学习Electron
javascript·学习·electron
Jenlybein1 小时前
进阶学习 Javascript ? 来看看这篇系统复习笔记 [ 面向对象篇 ]
前端·javascript·面试
Jenlybein1 小时前
进阶学习 Javascript ? 来看看这篇系统复习笔记 [ Generator 篇 ]
前端·javascript·面试
Jenlybein1 小时前
进阶学习 Javascript ? 来看看这篇系统复习笔记 [ Promise 与 async 篇 ]
前端·javascript·面试