zoukankan      html  css  js  c++  java
  • 备份一个个人用的WPF万能转换器

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Globalization;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Media;
    
    namespace XYY.Windows.SAAS.WpfExtention.Converters
    {
        public class CommonCoverter : IValueConverter
        {
            private static PropertyInfo[] _brushes;
            private static readonly Dictionary<string, Dictionary<string, string>> _globalParam2strKV = new Dictionary<string, Dictionary<string, string>>();
    
            /// 转换器参数语法: key1,value1 key2,value2 ...   [other,defaultValue] [object>bool] [contains(:)] [key1,RS_red  key2,#33f0f0f0 other,blue]
            ///               -----------1----------------   -------2------------ ------3------ ---4--------- ------------5------------------------
            /// 1:必填,为键值对,用空格分隔,不限键值对个数
            /// 2:选填,如果你想要1转成true,其他转成false: 1,true other,false ;也可以1和2转成true,其他转成flase: 1,true 2,true other,false
            /// 3:选填,像DataTrigger的value是object类型的,  如果用了此转换器需要手动指定转换类型. 例如  object>visibility 1,visible 2,hidden 
            /// 4:选填,只有在string->bool 时才使用,判断字符串中是否包含 例如 contains(某字符串),使用了4,1可以不填
            /// 5:选填,只有其他->brush时才能使用,支持从app资源获取、#加ARGB/RGB、brush枚举值名称
            /// 6:datetime->string 不需要写parameter 会自动把datetime的默认值转成空字符串
            /// 7:当value是枚举值时,会尝试直接返回description attribute的值,如果没有attribute照常返回
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                var vtype = value.GetType();
                const string other = "other";
                #region enum
                //如果是枚举值,description的attribute优先转换
                if (parameter == null && vtype.IsEnum)
                {
                    var memInfo = vtype.GetMember(value.ToString());
                    var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
                    if (attributes?.Count() > 0)
                    {
                        return (attributes[0] as DescriptionAttribute).Description;
                    }
                    else
                    {
                        return value;
                    }
                }
    
                #endregion
                #region 参数转dictionary
                string objectType = null;
    
                var paramStr = parameter as string ?? string.Empty;
                if (!((value is DateTime) && targetType == typeof(string)))
                {
                    if (targetType == typeof(object) && Regex.IsMatch(paramStr, @"object>(w+)"))
                        objectType = Regex.Match(paramStr, @"object>(w+)").Groups[1].Value;
                    if ((targetType == typeof(bool) || targetType == typeof(bool?) || objectType == "bool") && value is string v_str)
                    {
                        var r = v_str.Contains(Regex.Match(paramStr, @"((.*))").Groups[1].Value);
                        return r;
                    }
                    if (!_globalParam2strKV.ContainsKey(paramStr))
                    {
                        _globalParam2strKV.Add(paramStr, new Dictionary<string, string>());
    
                        foreach (Match m in Regex.Matches(paramStr, @"(w+)?\,[^s]+"))
                        {
                            var p_key = Regex.Match(m.Value, @"^(w+)?").Value.ToLower();
                            var p_value = Regex.Match(m.Value, @"(?<=\,)[^s]+$").Value;
                            _globalParam2strKV[paramStr].Add(p_key, p_value);
                        }
                    }
                }
                #endregion
                var valueStrLower = value?.ToString()?.ToLower() ?? string.Empty;
                //brush
                if (targetType == typeof(Brush) || targetType == typeof(SolidColorBrush) || objectType == "brush")
                {
                    if (_globalParam2strKV[paramStr].ContainsKey(valueStrLower))
                    {
                        var temp = _globalParam2strKV[paramStr][valueStrLower];
                        if (Regex.IsMatch(temp, @"^RS_"))
                        {
                            return Application.Current.TryFindResource(Regex.Replace(temp, @"^RS_", m => string.Empty));
                        }
                        else if (Regex.IsMatch(temp, @"^#"))
                        {
                            return new SolidColorBrush((Color)ColorConverter.ConvertFromString(temp));
                        }
                        else
                        {
                            if (_brushes?.Any() != true)
                            {
                                _brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static);
                            }
                            return _brushes.FirstOrDefault(t => t.Name.ToLower() == temp.ToLower())?.GetValue(null, null);
                        }
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : (object)Brushes.Transparent;
                    }
                }
    
                // to visibility
                if (targetType == typeof(Visibility) || targetType == typeof(Visibility?) || objectType == "visibility")
                {
                    if (_globalParam2strKV[paramStr].ContainsKey(valueStrLower))
                    {
                        var temp = _globalParam2strKV[paramStr][valueStrLower].ToLower();
                        Visibility visibilityResult = Visibility.Collapsed;
                        switch (temp)
                        {
                            case "visible":
                                visibilityResult = Visibility.Visible; break;
                            case "hidden":
                                visibilityResult = Visibility.Hidden; break;
                            case "collapsed":
                                visibilityResult = Visibility.Collapsed; break;
                            default:
                                break;
                        }
    
                        return visibilityResult;
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : (object)Visibility.Collapsed;
    
                    }
                }
                // to int
                if (targetType == typeof(int) || targetType == typeof(int?) || objectType == "int")
                {
                    if (_globalParam2strKV[paramStr].ContainsKey(valueStrLower))
                    {
                        var temp = _globalParam2strKV[paramStr][valueStrLower].ToLower();
                        return int.Parse(temp);
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : (object)0;
                    }
                }
                // to bool
                if (targetType == typeof(bool?) || targetType == typeof(bool) || objectType == "bool")
                {
                    if (_globalParam2strKV[paramStr].ContainsKey(valueStrLower))
                    {
                        var temp = _globalParam2strKV[paramStr][valueStrLower].ToLower();
                        return bool.Parse(temp);
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : (object)false;
                    }
                }
                // to string
                if (targetType == typeof(string) || objectType == "string")
                {
                    if (_globalParam2strKV[paramStr].ContainsKey(valueStrLower))
                    {
                        return _globalParam2strKV[paramStr][valueStrLower];
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : null;
                    }
                }
                //datetime
                if (targetType == typeof(string) && (value is DateTime dt))
                {
                    if (dt == DateTime.MinValue)
                    {
                        return string.Empty;
                    }
                    else
                    {
                        return _globalParam2strKV[paramStr].ContainsKey(other) ? _globalParam2strKV[paramStr][other] : (object)dt;
                    }
                }
    
    
                return Binding.DoNothing;
    
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return Binding.DoNothing;
            }
        }
    }
    
    
  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/nocanstillbb/p/9844231.html
Copyright © 2011-2022 走看看