macad.presentation解析converters

2024-04-14 14:28

本文主要是介绍macad.presentation解析converters,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.converters

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Windows; // 导入 System.Windows 命名空间,提供窗口应用程序的基本功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 标记 Converter 属性作为内容属性[ValueConversion(typeof(bool), typeof(bool))] // 声明值转换器,从布尔值到布尔值的转换public sealed class BoolToBoolConverter : ConverterMarkupExtension<BoolToBoolConverter> // 定义名为 BoolToBoolConverter 的布尔到布尔转换器类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 重写 Convert 方法,实现布尔到布尔的转换{if (PresentationHelper.IsInDesignMode) // 如果处于设计模式{return true; // 返回 true}bool b = false; // 声明并初始化布尔变量 b 为 falseif (value != null) // 如果值不为空{b = (bool)value; // 将值转换为布尔类型并赋值给变量 b};return b; // 返回变量 b}public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) // 重写 ConvertBack 方法,实现布尔到布尔的反向转换{if ((value == null) || (!(value is bool))) // 如果值为空或者不是布尔类型return false; // 返回 falsebool b = (bool)value; // 将值转换为布尔类型并赋值给变量 breturn b; // 返回变量 b}}// 定义的其余转换器类似,分别为 BoolToNotBoolConverter、BoolToVisibleHiddenConverter、BoolToVisibleCollapsedConverter、BoolToInvisibleHiddenConverter、BoolToInvisibleCollapsedConverter、BoolToParameterConverter 和 BoolNotToParameterConverter
}

这段代码定义了一系列的布尔到布尔、布尔到可见性以及布尔到参数的转换器类,用于在 WPF 中进行数据绑定时进行数据转换。这些转换器类实现了 IValueConverter 接口,并且使用了 ConverterMarkupExtension 类来简化 XAML 中的使用。每个转换器类中都实现了 Convert 方法和 ConvertBack 方法,用于实现正向和反向的数据转换。

2.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Windows; // 导入 System.Windows 命名空间,提供窗口应用程序的基本功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定功能
using System.Collections; // 导入 System.Collections 命名空间,提供集合类的功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 标记 Converter 属性作为内容属性[ValueConversion(typeof(ICollection), typeof(bool))] // 声明值转换器,从集合到布尔值的转换public sealed class CollectionNotEmptyToBoolConverter : ConverterMarkupExtension<CollectionNotEmptyToBoolConverter> // 定义名为 CollectionNotEmptyToBoolConverter 的集合到布尔转换器类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 重写 Convert 方法,实现集合到布尔的转换{if (PresentationHelper.IsInDesignMode) // 如果处于设计模式{return true; // 返回 true}bool b = false; // 声明并初始化布尔变量 b 为 falseif (value != null) // 如果值不为空{if (value != null) // 如果值不为空{b = ((ICollection)value).Count > 0; // 判断集合是否为空,将结果赋值给变量 b}};return b; // 返回变量 b}public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) // 重写 ConvertBack 方法,实现布尔到集合的反向转换{throw new NotSupportedException(); // 抛出 NotSupportedException 异常}}// 定义的其余转换器类似,分别为 CollectionNotEmptyToNotBoolConverter、CollectionNotEmptyToVisibleHiddenConverter、CollectionNotEmptyToVisibleCollapsedConverter、CollectionNotEmptyToInvisibleHiddenConverter、CollectionNotEmptyToInvisibleCollapsedConverter、CollectionNotEmptyToParameterConverter 和 CollectionNotEmptyNotToParameterConverter
}

这段代码定义了一系列的集合到布尔、集合到可见性以及集合到参数的转换器类,用于在 WPF 中进行数据绑定时进行数据转换。这些转换器类实现了 IValueConverter 接口,并且使用了 ConverterMarkupExtension 类来简化 XAML 中的使用。每个转换器类中都实现了 Convert 方法和 ConvertBack 方法,用于实现正向和反向的数据转换。

3.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Collections.Generic; // 导入 System.Collections.Generic 命名空间,提供泛型集合类的功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Reflection; // 导入 System.Reflection 命名空间,提供反射功能
using System.Windows; // 导入 System.Windows 命名空间,提供窗口应用程序的基本功能
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Media; // 导入 System.Windows.Media 命名空间,提供图形和动画功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 标记 Converter 属性作为内容属性[ValueConversion(typeof(Common.Color), typeof(Color))] // 声明值转换器,从 Common.Color 到 Color 的转换public sealed class ColorConverter : ConverterMarkupExtension<ColorConverter> // 定义名为 ColorConverter 的颜色转换器类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 重写 Convert 方法,实现 Common.Color 到 Color 的转换{if (value is Common.Color) // 如果值是 Common.Color 类型{var color = (Common.Color)value; // 将值转换为 Common.Color 类型return color.ToWpfColor(); // 调用 ToWpfColor 方法将 Common.Color 转换为 Color 类型}return new Color(); // 返回一个新的 Color 对象}public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) // 重写 ConvertBack 方法,实现 Color 到 Common.Color 的转换{if (value is Color) // 如果值是 Color 类型{var color = (Color)value; // 将值转换为 Color 类型return color.ToMmColor(); // 调用 ToMmColor 方法将 Color 转换为 Common.Color 类型}return new Common.Color(); // 返回一个新的 Common.Color 对象}}// 定义的其余转换器类似,分别为 ColorToBrushConverter 和 ColorToStringConverter
}

这段代码定义了一系列的颜色转换器类,用于在 WPF 中进行数据绑定时进行数据转换。这些转换器类实现了 IValueConverter 接口,并且使用了 ConverterMarkupExtension 类来简化 XAML 中的使用。每个转换器类中都实现了 Convert 方法和 ConvertBack 方法,用于实现正向和反向的数据转换。其中 ColorToStringConverter 还包含了一个静态属性 ColorMap 和其它一些辅助方法,用于颜色和字符串之间的转换。

4.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定功能
using System.Windows.Input; // 导入 System.Windows.Input 命名空间,提供输入设备的基本功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Media; // 导入 System.Windows.Media 命名空间,提供图形和动画功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 标记 Converter 属性作为内容属性[ValueConversion(typeof(IActionCommand), typeof(ImageSource))] // 声明值转换器,从 IActionCommand 到 ImageSource 的转换public sealed class CommandToIconConverter : ConverterMarkupExtension<CommandToIconConverter> // 定义名为 CommandToIconConverter 的命令到图标转换器类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 重写 Convert 方法,实现命令到图标的转换{switch (parameter) // 根据参数类型进行不同的转换{case IActionCommand command: // 如果参数是 IActionCommand 类型return Command.CreateImageSourceForIcon(command.GetIcon(value)); // 调用 Command.CreateImageSourceForIcon 方法获取命令的图标并转换为 ImageSourcecase ICommandSource commandSource: // 如果参数是 ICommandSource 类型var icon = (commandSource.Command as IActionCommand)?.GetIcon(commandSource.CommandParameter); // 获取命令源的命令,并调用 GetIcon 方法获取图标return Command.CreateImageSourceForIcon(icon); // 调用 Command.CreateImageSourceForIcon 方法转换图标为 ImageSourcedefault: // 默认情况return null; // 返回 null}}}
}

这段代码定义了一个名为 CommandToIconConverter 的转换器类,用于将命令转换为图标。该转换器实现了 IValueConverter 接口,并使用了 ConverterMarkupExtension 类来简化 XAML 中的使用。在 Convert 方法中,根据参数的类型进行不同的转换操作,如果参数是 IActionCommand 类型,则调用 Command.CreateImageSourceForIcon 方法获取命令的图标并转换为 ImageSource;如果参数是 ICommandSource 类型,则获取命令源的命令,并调用 GetIcon 方法获取图标,然后再调用 Command.CreateImageSourceForIcon 方法转换图标为 ImageSource;否则返回 null。

4.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{// See: http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/// 基类public abstract class ConverterMarkupExtension<T> : MarkupExtension, IValueConverter where T : class, new() // 定义 ConverterMarkupExtension<T> 抽象类,实现 IValueConverter 接口,其中 T 必须是引用类型且具有无参数构造函数{static T _Instance = null; // 静态字段 _Instance,存储泛型类型 T 的实例//--------------------------------------------------------------------------------------------------public static T Instance // 静态属性 Instance,用于获取泛型类型 T 的实例{get{if (_Instance == null) // 如果实例为空{_Instance = new T(); // 创建泛型类型 T 的新实例}return _Instance; // 返回实例}}//--------------------------------------------------------------------------------------------------public override object ProvideValue(IServiceProvider serviceProvider) // 重写 ProvideValue 方法,提供值转换器的实例{return Instance; // 返回泛型类型 T 的实例}//--------------------------------------------------------------------------------------------------#region IValueConverter Memberspublic virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 实现 Convert 方法,用于值的转换(子类需重写){return null; // 默认返回 null}//--------------------------------------------------------------------------------------------------public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) // 实现 ConvertBack 方法,用于反向值的转换(子类需重写){return null; // 默认返回 null}//--------------------------------------------------------------------------------------------------#endregion}}

这段代码定义了一个抽象基类 ConverterMarkupExtension<T>,用于简化值转换器的创建和使用。该基类实现了 IValueConverter 接口和 MarkupExtension 类,允许在 XAML 中直接使用。它具有一个静态字段 _Instance,用于存储泛型类型 T 的实例,并提供了一个静态属性 Instance 用于获取该实例。通过重写 ProvideValue 方法,可以在 XAML 中使用该基类来创建值转换器的实例。此外,该基类还定义了虚拟方法 ConvertConvertBack 用于值的转换,子类可以选择性地重写这些方法来实现特定的转换逻辑。

6.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Collections; // 导入 System.Collections 命名空间,提供集合类的功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器public sealed class DictionaryLookupConverter : ConverterMarkupExtension<DictionaryLookupConverter> // 定义 DictionaryLookupConverter 类,继承自 ConverterMarkupExtension<DictionaryLookupConverter> 类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 实现 Convert 方法,用于将值从一种类型转换为另一种类型{IDictionary dict = parameter as IDictionary; // 将参数转换为 IDictionary 类型if ((value != null) && (dict != null)) // 如果值和字典都不为空{return dict[value]; // 返回字典中与值对应的对象}else // 否则{return null; // 返回空}}}
}

这段代码定义了一个 DictionaryLookupConverter 类,它继承自 ConverterMarkupExtension<DictionaryLookupConverter> 类,实现了 IValueConverter 接口。该转换器用于在字典中查找与给定键对应的值,并将其作为结果返回。通过将字典作为参数传递给转换器,在调用 Convert 方法时,它会根据传入的值在字典中查找对应的对象,并返回该对象。如果值为 null 或字典为空,则返回 null。这样的转换器可以在 XAML 中直接使用,用于实现数据绑定时的值转换逻辑。

7.

using System; // 导入 System 命名空间,提供基本的系统类型和功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供区域性信息的功能
using System.Linq; // 导入 System.Linq 命名空间,提供 LINQ 查询功能
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定的功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Media; // 导入 System.Windows.Media 命名空间,提供图形相关的功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器[ValueConversion(typeof(double[]), typeof(DoubleCollection))] // 将 DoubleCollectionConverter 类标记为值转换器,将 double[] 类型转换为 DoubleCollection 类型public class DoubleCollectionConverter : ConverterMarkupExtension<DoubleCollectionConverter> // 定义 DoubleCollectionConverter 类,继承自 ConverterMarkupExtension<DoubleCollectionConverter> 类{public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) // 实现 Convert 方法,用于将值从一种类型转换为另一种类型{if (value is double[] array) // 如果值是 double[] 类型的数组{return new DoubleCollection(array); // 创建一个新的 DoubleCollection 对象,使用数组初始化}return new DoubleCollection(); // 如果值不是 double[] 类型的数组,则返回一个空的 DoubleCollection 对象}public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) // 实现 ConvertBack 方法,用于将值从一种类型转换为另一种类型(逆向转换){if (value is DoubleCollection collection) // 如果值是 DoubleCollection 类型的对象{return collection.ToArray(); // 将 DoubleCollection 对象转换为 double[] 数组并返回}return new double[0]; // 如果值不是 DoubleCollection 类型的对象,则返回一个空的 double[] 数组}}
}

这段代码定义了一个 DoubleCollectionConverter 类,它继承自 ConverterMarkupExtension<DoubleCollectionConverter> 类,并标记为值转换器,将 double[] 类型转换为 DoubleCollection 类型。该转换器用于将 double[] 数组转换为 DoubleCollection 对象,并提供逆向转换功能。在 Convert 方法中,如果传入的值是 double[] 类型的数组,则创建一个新的 DoubleCollection 对象,并使用数组初始化;如果值不是 double[] 类型的数组,则返回一个空的 DoubleCollection 对象。在 ConvertBack 方法中,如果传入的值是 DoubleCollection 类型的对象,则将其转换为 double[] 数组并返回;如果值不是 DoubleCollection 类型的对象,则返回一个空的 double[] 数组。这样的转换器可用于在 XAML 中实现数据绑定时,将 double[] 数组转换为 DoubleCollection 对象,或者将 DoubleCollection 对象转换为 double[] 数组。

8.

using System.Windows; // 导入 System.Windows 命名空间,提供 WPF 应用程序的基本类型和功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器public sealed class DoubleToThicknessLeftConverter : ConverterMarkupExtension<DoubleToThicknessLeftConverter> // 定义 DoubleToThicknessLeftConverter 类,继承自 ConverterMarkupExtension<DoubleToThicknessLeftConverter> 类{public override object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) // 实现 Convert 方法,用于将值从一种类型转换为另一种类型{return new Thickness(System.Convert.ToDouble(value), 0, 0, 0); // 返回一个 Thickness 对象,表示一个具有指定左侧宽度的边框}}
}

这段代码定义了一个 DoubleToThicknessLeftConverter 类,它继承自 ConverterMarkupExtension<DoubleToThicknessLeftConverter> 类,并将 Converter 属性标记为内容属性,以便在 XAML 中直接指定转换器。该转换器用于将 double 类型的值转换为 Thickness 类型,其中左侧边框的宽度由输入的 double 值确定。在 Convert 方法中,输入的值首先被转换为 double 类型,然后使用这个值作为左侧边框的宽度,并创建一个 Thickness 对象返回。这样的转换器可用于在 XAML 中设置元素的边框左侧宽度,例如通过绑定或样式的方式。

9.

using System; // 导入 System 命名空间,提供基本的系统功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供与区域性相关的信息和操作
using System.Windows; // 导入 System.Windows 命名空间,提供 WPF 应用程序的基本类型和功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供用于数据绑定的类型和功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器// 定义 EqualityToBoolConverter 类,继承自 ConverterMarkupExtension<EqualityToBoolConverter> 类public sealed class EqualityToBoolConverter : ConverterMarkupExtension<EqualityToBoolConverter>{// 实现 Convert 方法,用于将值从一种类型转换为另一种类型public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 在设计模式下,始终返回 trueif (PresentationHelper.IsInDesignMode){return true;}// 初始化布尔值为 falsebool b = false;// 根据参数类型执行不同的比较操作if (value != null){if (value is String){b = value.ToString() == (parameter as String);}else if (value is Int32){if (parameter is String){b = (Int32)value == Int32.Parse(parameter as String);}else{b = (Int32)value == (Int32)parameter;}}else if (value is Int64){if (parameter is String){b = (Int64)value == Int64.Parse(parameter as String);}else{b = (Int64)value == (Int64)parameter;}}else if (value is Double){if (parameter is String){b = (Double)value == Double.Parse(parameter as String, CultureInfo.InvariantCulture);}else{b = (Double)value == (Double)parameter;}}else if (value is Enum){if (parameter is String s){if (int.TryParse(s, out int i)){b = ((int)value) == i;}else{b = Enum.GetName(value.GetType(), value) == s;}}}else{b = value == parameter;}}// 返回布尔值return b;}// 实现 ConvertBack 方法,用于将值从一种类型转换回另一种类型public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){// 如果值为空或者不是布尔类型,则返回 falseif ((value == null) || (!(value is bool)))return false;// 将布尔值取反,并返回对应的参数值或默认值bool b = (bool)value;return b ? parameter : default;}}
}

这段代码定义了一系列的比较转换器,用于在 XAML 中根据条件进行布尔值、可见性等方面的转换。这些转换器都继承自 ConverterMarkupExtension 类,并实现了 ConvertConvertBack 方法。在 Convert 方法中,根据输入的值和参数进行不同类型的比较操作,确定返回的布尔值或可见性。在 ConvertBack 方法中,根据输入的值将其转换回原始值或默认值。这些转换器可以在 XAML 中用于数据绑定和视觉效果的控制。

10.

using System; // 导入 System 命名空间,提供基本的系统功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供与区域性相关的信息和操作
using System.IO; // 导入 System.IO 命名空间,提供文件和流操作相关的类型和功能
using System.IO.Compression; // 导入 System.IO.Compression 命名空间,提供对压缩和解压缩的支持
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供用于数据绑定的类型和功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Media; // 导入 System.Windows.Media 命名空间,提供对图形图像和其处理的支持
using System.Windows.Media.Imaging; // 导入 System.Windows.Media.Imaging 命名空间,提供用于图像处理的类型和功能namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器[ValueConversion(typeof(string), typeof(ImageSource))] // 指定该转换器从 string 类型转换为 ImageSource 类型public class ExtractFileThumbnailConverter : ConverterMarkupExtension<ExtractFileThumbnailConverter>{// 实现 Convert 方法,用于将文件名转换为缩略图图像public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 将输入值转换为文件名字符串var fileName = value as string;// 如果文件名为空,或者处于设计模式,或者文件不存在,则返回空if (fileName == null || PresentationHelper.IsInDesignMode || !File.Exists(fileName)){return null;}try{// 尝试打开 Zip 文件var archive = ZipFile.OpenRead(fileName);// 获取 Zip 文件中的缩略图 entryvar entry = archive.GetEntry("thumbnail.png");if (entry == null)return null;// 打开缩略图 entry 的流using var stream = entry.Open();// 使用 PngBitmapDecoder 解码缩略图流,生成 BitmapSourcevar decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.Default);var bitmap = decoder.Frames[0];// 返回生成的 BitmapSourcereturn bitmap;}catch (Exception){// 出现异常时返回空return null;}}}
}

这段代码定义了一个转换器 ExtractFileThumbnailConverter,用于从指定的 Zip 文件中提取缩略图并将其转换为 ImageSource 类型。在 Convert 方法中,首先检查输入的文件名是否为空,是否处于设计模式,以及文件是否存在。然后尝试打开 Zip 文件,并获取其中的缩略图 entry。如果找到了缩略图 entry,则打开其流并使用 PngBitmapDecoder 解码为 BitmapSource 类型的图像。最后将解码后的图像返回。如果出现任何异常,则返回空。

11.

using System; // 导入 System 命名空间,提供基本的系统功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供与区域性相关的信息和操作
using System.IO; // 导入 System.IO 命名空间,提供文件和流操作相关的类型和功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器public sealed class ExtractFileNameConverter : ConverterMarkupExtension<ExtractFileNameConverter>{// 实现 Convert 方法,用于从文件路径中提取文件名public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){var s = value as string;// 如果字符串为空或 null,则返回 "unnamed"if (string.IsNullOrEmpty(s)){return "unnamed";}// 使用 Path.GetFileName 提取文件名并返回return Path.GetFileName(s);}}//--------------------------------------------------------------------------------------------------[ContentProperty("Converter")]public sealed class ExtractFileNameNoExtensionConverter : ConverterMarkupExtension<ExtractFileNameNoExtensionConverter>{// 实现 Convert 方法,用于从文件路径中提取无扩展名的文件名public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){var s = value as string;// 如果字符串为空或 null,则返回 "unnamed"if (string.IsNullOrEmpty(s)){return "unnamed";}// 使用 Path.GetFileNameWithoutExtension 提取无扩展名的文件名并返回return Path.GetFileNameWithoutExtension(s);}}//--------------------------------------------------------------------------------------------------[ContentProperty("Converter")]public sealed class ExtractFileDirectoryConverter : ConverterMarkupExtension<ExtractFileDirectoryConverter>{// 实现 Convert 方法,用于从文件路径中提取目录名public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){var s = value as string;// 如果字符串为空或 null,则返回 "unnamed"if (string.IsNullOrEmpty(s)){return "unnamed";}// 使用 Path.GetDirectoryName 提取目录名并返回return Path.GetDirectoryName(s);}}
}

这段代码定义了三个转换器:

  1. ExtractFileNameConverter:用于从文件路径中提取文件名。
  2. ExtractFileNameNoExtensionConverter:用于从文件路径中提取无扩展名的文件名。
  3. ExtractFileDirectoryConverter:用于从文件路径中提取目录名。

这些转换器都实现了 Convert 方法,根据输入的文件路径字符串提取对应的信息,并返回处理后的结果。

12.

using System; // 导入 System 命名空间,提供基本的系统功能
using System.Globalization; // 导入 System.Globalization 命名空间,提供与区域性相关的信息和操作
using System.Windows; // 导入 System.Windows 命名空间,提供 WPF 应用程序的基本功能
using System.Windows.Markup; // 导入 System.Windows.Markup 命名空间,提供 XAML 标记解析器服务
using System.Windows.Data; // 导入 System.Windows.Data 命名空间,提供数据绑定的支持namespace Macad.Presentation // 定义命名空间 Macad.Presentation,用于自定义转换器
{[ContentProperty("Converter")] // 将 Converter 属性标记为内容属性,使 XAML 中可以直接指定转换器public sealed class GreaterThanToBoolConverter : ConverterMarkupExtension<GreaterThanToBoolConverter>{// 实现 Convert 方法,用于比较两个值的大小并返回布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,始终返回 true}bool b = false; // 默认布尔值为 falseif (value != null){if (value is string){return value.ToString().CompareTo(parameter as string) > 0; // 比较两个字符串的大小}else if (value is int){if (parameter is string){b = (int)value > int.Parse(parameter as string); // 将字符串参数转换为整数进行比较}else{b = (int)value > (int)parameter; // 直接比较两个整数}}else if (value is long){if (parameter is string){b = (long)value > long.Parse(parameter as string); // 将字符串参数转换为长整数进行比较}else{b = (long)value > (long)parameter; // 直接比较两个长整数}}else{b = ((IComparable)value).CompareTo((IComparable)parameter) > 0; // 使用通用的比较方法比较两个对象}}return b; // 返回比较结果}// 实现 ConvertBack 方法,不支持反向转换public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 同上,定义了其他几种转换器,用于返回不同的布尔值或可见性状态
}

这段代码定义了一系列用于比较两个值大小的转换器,它们分别是:

  1. GreaterThanToBoolConverter: 当第一个值大于第二个值时返回 true,否则返回 false。
  2. GreaterThanToNotBoolConverter: 当第一个值大于第二个值时返回 false,否则返回 true。
  3. GreaterThanToVisibleHiddenConverter: 当第一个值大于第二个值时返回 Visibility.Visible,否则返回 Visibility.Hidden
  4. GreaterThanToVisibleCollapsedConverter: 当第一个值大于第二个值时返回 Visibility.Visible,否则返回 Visibility.Collapsed
  5. GreaterThanToInvisibleHiddenConverter: 当第一个值不大于第二个值时返回 Visibility.Visible,否则返回 Visibility.Hidden
  6. GreaterThanToInvisibleCollapsedConverter: 当第一个值不大于第二个值时返回 Visibility.Visible,否则返回 Visibility.Collapsed
  7. GreaterThanToParameterConverter: 当第一个值大于第二个值时返回第二个值,否则返回空字符串。
  8. GreaterThanNotToParameterConverter: 当第一个值不大于第二个值时返回第二个值,否则返回空字符串。

每个转换器都实现了 IValueConverter 接口,其中 Convert 方法用于执行比较操作,并根据结果返回不同的值,而 ConvertBack 方法则不支持反向转换。这些转换器可以在 XAML 中用于数据绑定,用于根据条件控制布局或可见性。

13.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows.Data;
using System.Windows.Markup;namespace Macad.Presentation
{// 将Converters属性标记为内容属性,以便在XAML中指定一组转换器[ContentProperty("Converters")]public class GroupConverter : MarkupExtension, IValueConverter, IMultiValueConverter{// 提供Markup扩展的值public override object ProvideValue(IServiceProvider serviceProvider){return this;}//--------------------------------------------------------------------------------------------------// 多值转换器public IMultiValueConverter MultiValueConverter { get; set; }// 转换器列表public List<IValueConverter> Converters { get; set; } = new List<IValueConverter>();//--------------------------------------------------------------------------------------------------#region IValueConverter Members// 单值转换public object Convert(object value, Type targetType, object parameter, CultureInfo culture){return GroupConvert(value, Converters, parameter, culture);}// 单值反向转换public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){return GroupConvertBack(value, Converters.ToArray().Reverse(), parameter, culture);}// 将一系列转换器应用于给定值static object GroupConvert(object value, IEnumerable<IValueConverter> converters, object parameter, CultureInfo culture){return converters.Aggregate(value, (acc, conv) => conv.Convert(acc, typeof(object), parameter, culture));}// 将一系列转换器应用于给定值,反向进行static object GroupConvertBack(object value, IEnumerable<IValueConverter> converters, object parameter, CultureInfo culture){return converters.Aggregate(value, (acc, conv) => conv.ConvertBack(acc, typeof(object), parameter, culture));}#endregion#region IMultiValueConverter Members// 多值转换public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){// 检查是否设置了MultiValueConverterif (MultiValueConverter == null) throw new InvalidOperationException("To use the converter as a MultiValueConverter the MultiValueConverter property needs to be set."); // 首先使用多值转换器对值进行转换var firstConvertedValue = MultiValueConverter.Convert(values, targetType, parameter, culture);// 然后将一系列转换器应用于转换后的值return GroupConvert(firstConvertedValue, Converters, parameter, culture);}// 多值反向转换public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){// 检查是否设置了MultiValueConverterif (MultiValueConverter == null) throw new InvalidOperationException("To use the converter as a MultiValueConverter the MultiValueConverter property needs to be set."); // 首先将一系列转换器应用于给定值,反向进行var tailConverted = GroupConvertBack(value, Converters.ToArray().Reverse(), parameter, culture);// 然后使用多值转换器对值进行反向转换return MultiValueConverter.ConvertBack(tailConverted, targetTypes, parameter, culture);}#endregion}
}

这段代码定义了一个 GroupConverter 类,用于在 WPF 应用中将多个值或单个值应用于一系列转换器。它具有以下主要功能:

  • Converters 属性:用于存储一组要应用的转换器。
  • MultiValueConverter 属性:用于存储多值转换器,如果设置,则将首先应用多值转换器,然后将结果传递给一组转换器。
  • 实现了 IValueConverter 接口和 IMultiValueConverter 接口,因此可以用作单值转换器或多值转换器。
  • 提供了 ConvertConvertBack 方法,用于执行转换操作,它们会将给定值传递给一组转换器,并返回最终结果。
  • 使用 LINQ 的 Aggregate 方法来依次应用一系列转换器。

14.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;namespace Macad.Presentation
{// 将Converter属性标记为内容属性,并指定了值转换器的类型[ContentProperty("Converter")][ValueConversion(typeof(Enum), typeof(bool))]public sealed class HasFlagToBoolConverter : ConverterMarkupExtension<HasFlagToBoolConverter>{// 将枚举值转换为布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 检查枚举值是否包含特定标志b = ((Enum)value).HasFlag((Enum)Enum.Parse(value.GetType(), (string)parameter));}return b; // 返回布尔值}// 不支持从布尔值转换回枚举值,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定了值转换器的类型[ContentProperty("Converter")][ValueConversion(typeof(Enum), typeof(bool))]public sealed class HasFlagToNotBoolConverter : ConverterMarkupExtension<HasFlagToNotBoolConverter>{// 将枚举值转换为与HasFlagToBoolConverter相反的布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 检查枚举值是否包含特定标志b = ((Enum)value).HasFlag((Enum)Enum.Parse(value.GetType(), (string)parameter));}return !b; // 返回布尔值的相反值}// 不支持从布尔值转换回枚举值,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 其余的转换器类似,它们将枚举值转换为可见性类型,根据是否包含特定标志来确定可见性// 它们也具有相应的转换回方法,但通常不需要这种转换,因此都会抛出异常
}

这段代码定义了一系列将枚举值转换为不同类型的值转换器,例如布尔值和可见性。它们的作用是根据枚举值是否包含特定标志来确定转换后的值。这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常。

15.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;namespace Macad.Presentation
{// 将Converter属性标记为内容属性,并指定了值转换器的类型[ContentProperty("Converter")][ValueConversion(typeof(int), typeof(bool))]public sealed class IndexIsValidToBoolConverter : ConverterMarkupExtension<IndexIsValidToBoolConverter>{// 将索引是否有效转换为布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 检查索引是否大于等于零b = (((int)value) >= 0);}return b; // 返回布尔值}// 不支持从布尔值转换回索引,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定了值转换器的类型[ContentProperty("Converter")][ValueConversion(typeof(int), typeof(bool))]public sealed class IndexIsValidToNotBoolConverter : ConverterMarkupExtension<IndexIsValidToNotBoolConverter>{// 将索引是否有效转换为与IndexIsValidToBoolConverter相反的布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 检查索引是否大于等于零b = (((int)value) >= 0);}return !b; // 返回布尔值的相反值}// 不支持从布尔值转换回索引,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 其余的转换器类似,它们将索引是否有效转换为可见性类型,根据索引是否有效来确定可见性// 它们也具有相应的转换回方法,但通常不需要这种转换,因此都会抛出异常
}

这段代码定义了一系列将整数值(索引)转换为不同类型的值转换器,例如布尔值和可见性。它们的作用是根据索引是否大于等于零来确定转换后的值。这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常。

16.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;
using System.Linq;namespace Macad.Presentation
{// 将Converter属性标记为内容属性,并指定了值转换器的类型[ContentProperty("Converter")][ValueConversion(typeof(object), typeof(bool))]public sealed class IsTypeToBoolConverter : ConverterMarkupExtension<IsTypeToBoolConverter>{// 将对象是否为指定类型或其派生类的实例转换为布尔值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 根据参数类型进行转换if (parameter is string typestr1){var typestr2 = value.GetType().ToString();// 检查对象类型是否匹配参数指定的类型b = (parameter as string).Split(';').Any(p => p.Equals(typestr2));}else if (parameter is Type type){// 检查对象类型是否可以分配给参数指定的类型b = value.GetType().IsAssignableFrom(type);}else {b = false;}}return b; // 返回布尔值}// 不支持从布尔值转换回对象类型,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 其余的转换器类似,它们将对象是否为指定类型或其派生类的实例转换为布尔值或可见性类型// 它们也具有相应的转换回方法,但通常不需要这种转换,因此都会抛出异常
}

这段代码定义了一系列将对象是否为指定类型或其派生类的实例转换为布尔值或可见性类型的值转换器。它们通过参数来指定要检查的目标类型,并根据对象的类型来进行转换。这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常。

17.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;namespace Macad.Presentation
{// 将Converter属性标记为内容属性public sealed class LowerThanToBoolConverter : ConverterMarkupExtension<LowerThanToBoolConverter>{// 将对象与参数进行比较,判断是否小于参数值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){// 根据值的类型进行比较if (value is String){return value.ToString().CompareTo(parameter as String) < 0; // 比较字符串}else if (value is Int32){if (parameter is String){b = (Int32)value < Int32.Parse(parameter as String); // 比较Int32}else{b = (Int32)value < (Int32)parameter;}}else if (value is Int64){if (parameter is String){b = (Int64)value < Int64.Parse(parameter as String); // 比较Int64}else{b = (Int64)value < (Int64)parameter;}}else{// 对于其他类型,检查是否实现了IComparable接口,然后再进行比较b = (value is IComparable).CompareTo((parameter is IComparable)) < 0;}}return b; // 返回布尔值}// 不支持从布尔值转换回对象类型,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 其余的转换器类似,它们将对象与参数进行比较,并根据比较结果返回布尔值或可见性类型// 这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常
}

这段代码定义了一系列将对象与参数进行比较,并根据比较结果返回布尔值或可见性类型的值转换器。转换器根据值的类型来选择合适的比较方法,支持字符串、Int32和Int64类型的比较。这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常。

18.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;namespace Macad.Presentation
{// 将Converter属性标记为内容属性,值转换为布尔类型public sealed class NotNullToBoolConverter : ConverterMarkupExtension<NotNullToBoolConverter>{// 将值转换为布尔值,如果值不为空,则返回true,否则返回falsepublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (PresentationHelper.IsInDesignMode){return true; // 在设计模式下,返回true}bool b = false; // 初始化布尔值为falseif (value != null){b = true; // 如果值不为空,将布尔值设为true}return b; // 返回布尔值}// 不支持从布尔值转换回对象类型,因此抛出异常public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 其余的转换器类似,它们将值转换为布尔值或可见性类型// 这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常
}

这段代码定义了一系列将值转换为布尔值或可见性类型的值转换器,其中当值不为空时返回true,否则返回false。这些转换器还具有相应的反向转换方法,但通常不需要这种转换,因此都会抛出异常。

19.

using System;
using System.Globalization;
using System.Windows.Markup;namespace Macad.Presentation
{// 将Converter属性标记为内容属性public sealed class PercentageConverter : ConverterMarkupExtension<PercentageConverter>{// 将值转换为百分比表示形式public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果值是双精度浮点数类型if (value is double){// 将值乘以100,得到百分比表示形式return ((double)value) * 100;}// 如果值是单精度浮点数类型if (value is float){// 将值乘以100,得到百分比表示形式return ((float)value) * 100;}// 如果值不是浮点数类型,则返回0return 0;}// 将百分比表示形式转换回原始值public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){// 如果值是双精度浮点数类型if (value is double){// 将百分比表示形式除以100,得到原始值return ((double)value) / 100;}// 如果值是单精度浮点数类型if (value is float){// 将百分比表示形式除以100,得到原始值return ((float)value) / 100;}// 如果值不是浮点数类型,则返回0return 0;}}
}

这段代码定义了一个名为PercentageConverter的值转换器类,用于将值转换为百分比表示形式。它包含了两个方法,Convert用于将值转换为百分比形式,ConvertBack用于将百分比形式转换回原始值。这个转换器可以处理双精度浮点数和单精度浮点数类型的值。

20.

using System;
using System.Globalization;
using System.IO;
using System.Windows.Markup;
using Macad.Common;namespace Macad.Presentation
{// 将Converter属性标记为内容属性public sealed class RemoveFileExtensionConverter : ConverterMarkupExtension<RemoveFileExtensionConverter>{// 将文件路径字符串转换为不带扩展名的文件名public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 将值转换为字符串类型var s = value as string;// 如果字符串为空或null,则返回空字符串if (s.IsNullOrEmpty())return "";// 使用Path.GetFileNameWithoutExtension方法获取不带扩展名的文件名return Path.GetFileNameWithoutExtension(s);}}
}

这段代码定义了一个名为RemoveFileExtensionConverter的值转换器类,用于将文件路径字符串转换为不带扩展名的文件名。它包含了一个方法Convert,用于执行转换操作。该方法首先将值转换为字符串类型,然后使用Path.GetFileNameWithoutExtension方法获取不带扩展名的文件名,并返回该文件名。

21.

using System;
using System.Globalization;
using System.Windows.Markup;namespace Macad.Presentation
{// 将Converter属性标记为内容属性public sealed class StringUppercaseConverter : ConverterMarkupExtension<StringUppercaseConverter>{// 执行转换操作,将字符串转换为大写形式public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 将值转换为字符串类型var s = value as string;// 如果值为null,则返回空字符串if (s == null){return "";}// 使用ToUpper方法将字符串转换为大写形式,并返回结果return s.ToUpper();}}
}

这段代码定义了一个名为StringUppercaseConverter的值转换器类,用于将字符串转换为大写形式。它包含了一个方法Convert,用于执行转换操作。该方法首先将值转换为字符串类型,然后使用ToUpper方法将字符串转换为大写形式,并返回结果。

22.

using System;
using System.Globalization;
using System.Threading;
using System.Windows.Markup;namespace Macad.Presentation
{// 将Converter属性标记为内容属性public sealed class StringFormatConverter : ConverterMarkupExtension<StringFormatConverter>{// 执行转换操作,使用指定的格式化字符串格式化值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果参数为null,则返回错误信息if (parameter == null){return "ConverterParameter must not be null.";}// 使用string.Format方法将值和参数格式化为字符串,并返回结果return string.Format((string)parameter, value);}}// 将Converter属性标记为内容属性public sealed class StringFormatIfNotEmptyConverter : ConverterMarkupExtension<StringFormatIfNotEmptyConverter>{// 执行转换操作,如果值不为空,则使用指定的格式化字符串格式化值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果值不为null且长度大于0,则使用string.Format方法将值和参数格式化为字符串,并返回结果if (value != null && value.ToString().Length > 0){return string.Format((string)parameter, value);}// 否则返回空字符串return "";}}// 将Converter属性标记为内容属性public sealed class StringFormatCultureConverter : ConverterMarkupExtension<StringFormatCultureConverter>{// 执行转换操作,使用指定的语言文化和格式化字符串格式化值public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 使用当前UI线程的当前区域设置和指定的格式化字符串格式化值,并返回结果return string.Format(Thread.CurrentThread.CurrentUICulture, (string)parameter, value);}}// StringFormatToUriConverter 类没有继承 ConverterMarkupExtension 类,但实现了 IValueConverter 接口,用于将字符串转换为 Uri 对象public class StringFormatToUriConverter : ConverterMarkupExtension<StringFormatToUriConverter>{// 执行转换操作,将值格式化为 Uri 对象public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 使用指定的格式化字符串和值创建 Uri 对象,并返回结果return new Uri(string.Format(parameter.ToString(), value));}// 执行反向转换操作,将 Uri 对象转换为值public override object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture){// 返回 null,因为反向转换不支持return null;}}
}

这段代码定义了几个字符串格式化转换器类:

  1. StringFormatConverter:根据指定的格式化字符串将值格式化为字符串。
  2. StringFormatIfNotEmptyConverter:如果值不为空,则根据指定的格式化字符串将值格式化为字符串;否则返回空字符串。
  3. StringFormatCultureConverter:使用指定的语言文化和格式化字符串将值格式化为字符串。
  4. StringFormatToUriConverter:将字符串格式化为 Uri 对象,反向转换不支持。

这些转换器类可以在 XAML 中用作值转换器,用于在界面元素之间转换值的格式和类型。

23.

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Data;namespace Macad.Presentation
{// 将Converter属性标记为内容属性,并指定值转换类型为string到boolpublic sealed class StringNotEmptyToBoolConverter : ConverterMarkupExtension<StringNotEmptyToBoolConverter>{// 执行转换操作,将非空字符串转换为true,空字符串转换为falsepublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回trueif (PresentationHelper.IsInDesignMode){return true;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}return b;}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定值转换类型为string到boolpublic sealed class StringNotEmptyToNotBoolConverter : ConverterMarkupExtension<StringNotEmptyToNotBoolConverter>{// 执行转换操作,将非空字符串转换为false,空字符串转换为truepublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回trueif (PresentationHelper.IsInDesignMode){return true;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}return !b;}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定值转换类型为string到Visibilitypublic sealed class StringNotEmptyToVisibleHiddenConverter : ConverterMarkupExtension<StringNotEmptyToVisibleHiddenConverter>{// 执行转换操作,将非空字符串转换为Visible,空字符串转换为Hiddenpublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回Visibleif (PresentationHelper.IsInDesignMode){return Visibility.Visible;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 返回对应的Visibilityif (b == true){return Visibility.Visible;}else{return Visibility.Hidden;}}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定值转换类型为string到Visibilitypublic sealed class StringNotEmptyToVisibleCollapsedConverter : ConverterMarkupExtension<StringNotEmptyToVisibleCollapsedConverter>{// 执行转换操作,将非空字符串转换为Visible,空字符串转换为Collapsedpublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回Visibleif (PresentationHelper.IsInDesignMode){return Visibility.Visible;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 返回对应的Visibilityif (b == true){return Visibility.Visible;}else{return Visibility.Collapsed;}}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定值转换类型为string到Visibilitypublic sealed class StringNotEmptyToInvisibleHiddenConverter : ConverterMarkupExtension<StringNotEmptyToInvisibleHiddenConverter>{// 执行转换操作,将非空字符串转换为Visible,空字符串转换为Hiddenpublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回Visibleif (PresentationHelper.IsInDesignMode){return Visibility.Visible;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 返回对应的Visibilityif (b == false){return Visibility.Visible;}else{return Visibility.Hidden;}}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性,并指定值转换类型为string到Visibilitypublic sealed class StringNotEmptyToInvisibleCollapsedConverter : ConverterMarkupExtension<StringNotEmptyToInvisibleCollapsedConverter>{// 执行转换操作,将非空字符串转换为Visible,空字符串转换为Collapsedpublic override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回Visibleif (PresentationHelper.IsInDesignMode){return Visibility.Visible;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 返回对应的Visibilityif (b == false){return Visibility.Visible;}else{return Visibility.Collapsed;}}// 不支持反向转换,抛出NotSupportedExceptionpublic override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}}// 将Converter属性标记为内容属性public sealed class StringNotEmptyToParameterConverter : ConverterMarkupExtension<StringNotEmptyToParameterConverter>{// 执行转换操作,如果字符串不为空,则返回参数值,否则返回空字符串public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回trueif (PresentationHelper.IsInDesignMode){return true;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 如果b为true,则返回参数值,否则返回空字符串if (b == true){return parameter;}else{return "";}}}// 将Converter属性标记为内容属性public sealed class StringNotEmptyNotToParameterConverter : ConverterMarkupExtension<StringNotEmptyNotToParameterConverter>{// 执行转换操作,如果字符串为空,则返回参数值,否则返回空字符串public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果处于设计模式,则始终返回trueif (PresentationHelper.IsInDesignMode){return true;}bool b = false;// 如果值不为null且长度大于0,则设置为trueif (value != null){if (value.ToString().Length > 0){b = true;}}// 如果b为false,则返回参数值,否则返回空字符串if (b == false){return parameter;}else{return "";}}}
}

整段代码定义了一系列将非空字符串转换为不同类型的转换器类:

  1. StringNotEmptyToBoolConverter:将非空字符串转换为布尔型,空字符串转换为false。
  2. StringNotEmptyToNotBoolConverter:将非空字符串转换为布尔型,空字符串转换为true。
  3. StringNotEmptyToVisibleHiddenConverter:将非空字符串转换为可见状态,空字符串转换为隐藏状态。
  4. StringNotEmptyToVisibleCollapsedConverter:将非空字符串转换为可见状态,空字符串转换为折叠状态。
  5. StringNotEmptyToInvisibleHiddenConverter:将非空字符串转换为隐藏状态,空字符串转换为可见状态。
  6. StringNotEmptyToInvisibleCollapsedConverter:将非空字符串转换为隐藏状态,空字符串转换为折叠状态。
  7. StringNotEmptyToParameterConverter:如果字符串不为空,则返回参数值,否则返回空字符串。
  8. StringNotEmptyNotToParameterConverter:如果字符串为空,则返回参数值,否则返回空字符串。

这些转换器类可以在 XAML 中用作值转换器,根据字符串的内容和长度将其转换为不同的布尔值、可见性状态或其他字符串值。

24.

using System;
using System.Collections.ObjectModel;
using System.Diagnostics.Contracts;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;// 用于创建类似于 switch 语句的转换器// Usage:
//<Grid>
//    <Grid.Resources>
//        <p:SwitchConverter x:Key="WeatherIcons">
//            <p:SwitchCase When="Sunny" Then="Sunny.png" />
//            <p:SwitchCase When="Cloudy" Then="Cloudy.png" />
//            <p:SwitchCase When="Rain" Then="Rain.png" />
//            <p:SwitchCase When="Snow" Then="Snow.png" />
//        </p:SwitchConverter>
//    </Grid.Resources>
//    <Image Operand="{Binding Condition, Converter={StaticResource WeatherIcons}}" />
//</Grid>namespace Macad.Presentation
{/// <summary>/// An individual case in the switch statement./// </summary>[ContentProperty("Then")]public sealed class SwitchCase : DependencyObject{#region Constructors/// <summary>/// Initializes a new instance of the <see cref="T:SwitchCase"/> class./// </summary>public SwitchCase(){}#endregion#region Properties// 匹配输入值的值public object When{get { return (object)GetValue(WhenProperty); }set { SetValue(WhenProperty, value); }}public static readonly DependencyProperty WhenProperty = DependencyProperty.Register("When", typeof(object), typeof(SwitchCase), new PropertyMetadata(default(object)));// 如果当前条件匹配,则使用的输出值public object Then{get { return (object)GetValue(ThenProperty); }set { SetValue(ThenProperty, value); }}public static readonly DependencyProperty ThenProperty = DependencyProperty.Register("Then", typeof(object), typeof(SwitchCase), new PropertyMetadata(default(object)));#endregion}/// <summary>/// A collection of switch cases./// </summary>public sealed class SwitchCaseCollection : Collection<SwitchCase>{#region Constructors/// <summary>/// Initializes a new instance of the <see cref="T:SwitchCaseCollection"/> class./// </summary>internal SwitchCaseCollection(){}#endregion#region Methods/// <summary>/// Adds a new case to the collection./// </summary>/// <param name="when">The value to compare against the input.</param>/// <param name="then">The output value to use if the case matches.</param>public void Add(object when, object then){Add(new SwitchCase { When = when, Then = then });}#endregion}/// <summary>/// Produces an output value based upon a collection of case statements./// </summary>[ContentProperty("Cases")]public class SwitchConverter : IValueConverter{#region Constructors/// <summary>/// Initializes a new instance of the <see cref="T:SwitchConverter"/> class./// </summary>public SwitchConverter(): this(new SwitchCaseCollection()){}/// <summary>/// Initializes a new instance of the <see cref="T:SwitchConverter"/> class./// </summary>/// <param name="cases">The case collection.</param>internal SwitchConverter(SwitchCaseCollection cases){Contract.Requires(cases != null);Cases = cases;StringComparison = StringComparison.OrdinalIgnoreCase;}#endregion#region Properties/// <summary>/// Holds a collection of switch cases that determine which output/// value will be produced for a given input value./// </summary>public SwitchCaseCollection Cases { get; private set; }/// <summary>/// Specifies the type of comparison performed when comparing the input/// value against a case./// </summary>public StringComparison StringComparison { get; set; }/// <summary>/// An optional value that will be output if none of the cases match./// </summary>public object Else { get; set; }#endregion#region Methods/// <summary>/// Converts a value./// </summary>public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value == null){// 对null进行特殊处理,只有当null输入等于null时,才需要进行转换return Cases.FirstOrDefault(x => x.When == null) ?? Else;}foreach (var c in Cases.Where(x => x.When != null)){// 对字符串进行特殊处理,进行字符串之间的比较if (value is string && c.When is string){if (String.Equals((string)value, (string)c.When, StringComparison)){return c.Then;}}object when = c.When;// 使用 IConvertible 接口将值转换为与输入值兼容的类型if (TryConvert(culture, value, ref when)){if (value.Equals(when)){return c.Then;}}}return Else;}/// <summary>/// Converts a value./// </summary>public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}/// <summary>/// Attempts to use the IConvertible interface to convert <paramref name="value2"/> into a type/// compatible with <paramref name="value1"/>./// </summary>private static bool TryConvert(CultureInfo culture, object value1, ref object value2){Type type1 = value1.GetType();Type type2 = value2.GetType();if (type1 == type2){return true;}if (type1.IsEnum){value2 = Enum.Parse(type1, value2.ToString(), true);return true;}var convertible1 = value1 as IConvertible;var convertible2 = value2 as IConvertible;if (convertible1 != null && convertible2 != null){value2 = System.Convert.ChangeType(value2, type1, culture);return true;}return false;}#endregion}
}

这段代码定义了一个类 SwitchConverter,它可以在 XAML 中模拟 switch 语句的功能。通过定义 SwitchCaseSwitchCaseCollection 来表示 switch 语句中的各个 case,然后通过 SwitchConverter 类进行匹配和转换。

这个类允许用户在 XAML 中定义一系列的 SwitchCase,然后根据输入值查找匹配的 SwitchCase 并输出相应的值。如果没有匹配的 SwitchCase,则输出用户定义的 Else 值。

25.

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;namespace Macad.Presentation
{// 此类用于在 XAML 中将快捷方式转换为标题,并添加附加信息[ContentProperty("Converter")][ValueConversion(typeof(string), typeof(string))]public sealed class ShortcutToTitleConverter : ConverterMarkupExtension<ShortcutToTitleConverter>{// 将快捷方式转换为标题,并添加附加信息public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is string strValue){if (parameter is String strParam){// 如果参数不为空,则将参数和快捷方式值组合起来return $"{strParam} ({strValue})";}// 否则返回快捷方式值本身return strValue;}else{// 如果输入值不是字符串,则直接返回参数值return parameter;}}}
}

这段代码定义了一个名为 ShortcutToTitleConverter 的类,它实现了 IValueConverter 接口,并继承了 ConverterMarkupExtension。该转换器用于将快捷方式转换为标题,并可选择添加附加信息。

  • ShortcutToTitleConverter 类实现了 IValueConverter 接口,用于在 XAML 中进行值转换。
  • Convert 方法接受输入值、目标类型、转换器参数和文化信息,并根据输入值和参数来转换输出值。
  • 如果输入值是字符串,则根据参数将快捷方式值和参数值组合成标题返回;如果参数为空,则直接返回快捷方式值本身。
  • 如果输入值不是字符串,则直接返回参数值。

26.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
using System.Windows.Media;namespace Macad.Presentation
{// 此类用于将类型转换为对应的图像源[ContentProperty("Converter")][ValueConversion(typeof(object), typeof(ImageSource))]public class TypeToImageSourceConverter : ConverterMarkupExtension<TypeToImageSourceConverter>{// 将类型转换为对应的图像源public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果值为空或者处于设计模式,则返回空if (value == null || PresentationHelper.IsInDesignMode)return null;Drawing drawing = null;// 尝试从缓存中获取绘图对象if (!_Cache.TryGetValue(value.GetType(), out drawing)){var typeName = Common.Serialization.Serializer.ApplyNamespaceAlias(value.GetType().FullName);var key = $"TypeIcon_{typeName.Replace('.', '-')}";// 尝试作为 XAML 资源处理try{drawing = Application.Current.Resources[key] as Drawing;}catch (Exception){// 图像不可用,因此在将来的请求中不再尝试_Cache.Add(value.GetType(), null);return null;}_Cache.Add(value.GetType(), drawing);}// 如果绘图对象为空,则返回空if (drawing == null)return null;// 创建绘图图像并冻结var drawingImage = new DrawingImage(drawing);drawingImage.Freeze();return drawingImage;}//--------------------------------------------------------------------------------------------------// 缓存类型和绘图对象的映射关系readonly Dictionary<Type, Drawing> _Cache = new Dictionary<Type, Drawing>();//--------------------------------------------------------------------------------------------------}//--------------------------------------------------------------------------------------------------// 此类用于将类型转换为对应的字符串表示[ContentProperty("Converter")][ValueConversion(typeof(object), typeof(string))]public class TypeToStringConverter : ConverterMarkupExtension<TypeToStringConverter>{// 将类型转换为对应的字符串表示public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果值为空,则返回 "null"if (value == null)return "null";// 应用命名空间别名并返回类型全名return Common.Serialization.Serializer.ApplyNamespaceAlias(value.GetType().FullName);}//--------------------------------------------------------------------------------------------------}
}

这段代码定义了两个类:TypeToImageSourceConverterTypeToStringConverter

  • TypeToImageSourceConverter 类用于将类型转换为对应的图像源,其中 Convert 方法将类型转换为绘图对象,并尝试从缓存中获取以提高性能。
  • TypeToStringConverter 类用于将类型转换为对应的字符串表示,其中 Convert 方法返回类型的全名,并应用了命名空间别名。

28.

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;namespace Macad.Presentation
{// 用于将 ValueUnits 枚举转换为对应的字符串表示[ContentProperty("Converter")][ValueConversion(typeof(ValueUnits), typeof(string))]public class ValueUnitsToStringConverter : ConverterMarkupExtension<ValueUnitsToStringConverter>{// 将 ValueUnits 枚举转换为对应的字符串表示public override object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 如果值不是 ValueUnits 枚举类型,则返回 nullif (!(value is ValueUnits))return null;// 根据枚举值返回相应的字符串表示switch ((ValueUnits)value){case ValueUnits.Length:return "mm";case ValueUnits.Degree:return "°";case ValueUnits.Percent:return "%";case ValueUnits.DotsPerInch:return "dpi";}return "";}}
}

这段代码定义了一个名为 ValueUnitsToStringConverter 的类,用于将 ValueUnits 枚举转换为对应的字符串表示。 Convert 方法根据枚举值返回相应的字符串表示,例如,Length 枚举值对应 "mm",Degree 枚举值对应 "°",以此类推。

这篇关于macad.presentation解析converters的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903222

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库