• 备份一个个人用的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;
            }
        }
    }
    
    
  • 相关阅读:
    2822 爱在心中
    P1707 刷题比赛
    1269 匈牙利游戏
    1482 路线统计
    Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)
    P2022 有趣的数
    1087 麦森数
    P1111 修复公路
    python为在线漫画站点自制非官方API(未完待续)
    逻辑运算0==x和x==0具体解释
  • 原文地址:https://www.cnblogs.com/nocanstillbb/p/9844231.html
Copyright © 2020-2023  润新知