WPF之值转换器

news2025/5/10 12:46:11

文章目录

    • 目录
    • 什么是值转换器
    • IValueConverter接口
      • Convert方法
      • ConvertBack方法
    • 创建和使用值转换器
      • 定义转换器类
      • 在XAML中使用转换器
      • 转换器参数(ConverterParameter)
    • 常用转换器实现
      • 布尔值转可见性(BoolToVisibilityConverter)
      • 数值转换(NumberConverter)
      • 字符串格式化(StringFormatConverter)
      • 枚举转文本(EnumToStringConverter)
    • 多值转换器(IMultiValueConverter)
      • 接口定义
      • 实现示例
    • 值转换器的最佳实践
    • 总结
    • 参考资料

可以根据Github拉取示例程序运行
GitHub程序演示地址(点击直达)
也可以在本文资源中下载
在这里插入图片描述

在WPF应用程序开发中,值转换器(Value Converter)是数据绑定过程中的重要组成部分,它允许我们在源对象和目标对象之间传递数据时进行转换。通过值转换器,我们可以处理不同数据类型之间的转换、格式化显示数据、实现复杂的UI逻辑等。本文将详细介绍WPF中值转换器的工作原理、实现方式以及常见应用场景。

目录

  • 什么是值转换器
  • IValueConverter接口
    • Convert方法
    • ConvertBack方法
  • 创建和使用值转换器
    • 定义转换器类
    • 在XAML中使用转换器
    • 转换器参数(ConverterParameter)
  • 常用转换器实现
    • 布尔值转可见性(BoolToVisibilityConverter)
    • 数值转换(NumberConverter)
    • 字符串格式化(StringFormatConverter)
    • 枚举转文本(EnumToStringConverter)
  • 多值转换器(IMultiValueConverter)
    • 接口定义
    • 实现示例
  • 值转换器的最佳实践
  • 总结
  • 参考资料

什么是值转换器

值转换器是WPF数据绑定系统中的一个重要概念,它充当源数据和目标UI元素之间的"翻译器"。当数据从源传递到目标(或反向传递)时,值转换器可以修改或转换这些数据。

例如,假设我们有一个布尔值表示某个项目是否完成,而我们想在UI中通过显示或隐藏元素来表示这个状态。这时,我们就需要一个将布尔值转换为Visibility枚举的转换器。

绑定
转换后的数据
用户输入
转换回的数据
源数据
值转换器
目标UI元素
值转换器

IValueConverter接口

在WPF中,所有的值转换器都必须实现IValueConverter接口。这个接口定义在System.Windows.Data命名空间中,包含两个方法:ConvertConvertBack

public interface IValueConverter
{
    object Convert(object value, Type targetType, object parameter, CultureInfo culture);
    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
}

Convert方法

Convert方法在数据从源流向目标(例如,从视图模型到UI元素)时被调用。它接收四个参数:

  1. value:要转换的源数据。
  2. targetType:目标属性的类型。
  3. parameter:可以用来控制转换逻辑的附加参数。
  4. culture:应用于转换的区域性信息。

方法返回转换后的值,该值将被用作目标属性的值。

ConvertBack方法

ConvertBack方法在数据从目标流向源(例如,从UI元素到视图模型)时被调用。它与Convert方法具有相同的参数,但方向相反:

  1. value:要转换回的目标数据。
  2. targetType:源属性的类型。
  3. parameter:可以用来控制转换逻辑的附加参数。
  4. culture:应用于转换的区域性信息。

方法返回转换回的值,该值将被用作源属性的值。

创建和使用值转换器

定义转换器类

下面是一个简单的转换器示例,它将布尔值转换为Visibility枚举值:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfConverterDemo.Converters
{
    /// <summary>
    /// 将布尔值转换为Visibility枚举的转换器
    /// 当值为true时返回Visible,否则返回Collapsed
    /// </summary>
    public class BoolToVisibilityConverter : IValueConverter
    {
        /// <summary>
        /// 将布尔值转换为Visibility值
        /// </summary>
        /// <param name="value">要转换的布尔值</param>
        /// <param name="targetType">目标类型(应为Visibility)</param>
        /// <param name="parameter">如果不为null且等于"Invert",则反转逻辑</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>Visibility.Visible或Visibility.Collapsed</returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 检查value是否为布尔类型
            if (!(value is bool))
                return Visibility.Collapsed; // 默认为隐藏
            
            bool boolValue = (bool)value;
            
            // 检查是否需要反转逻辑
            if (parameter != null && parameter.ToString() == "Invert")
                boolValue = !boolValue;
            
            // 如果true则显示,否则隐藏
            return boolValue ? Visibility.Visible : Visibility.Collapsed;
        }

        /// <summary>
        /// 将Visibility值转换回布尔值
        /// </summary>
        /// <param name="value">要转换的Visibility值</param>
        /// <param name="targetType">目标类型(应为bool)</param>
        /// <param name="parameter">如果不为null且等于"Invert",则反转逻辑</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>true或false</returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 检查value是否为Visibility类型
            if (!(value is Visibility))
                return false; // 默认为false
            
            // 判断是否为Visible
            bool result = ((Visibility)value == Visibility.Visible);
            
            // 检查是否需要反转逻辑
            if (parameter != null && parameter.ToString() == "Invert")
                result = !result;
            
            return result;
        }
    }
}

在XAML中使用转换器

要在XAML中使用值转换器,首先需要将其声明为资源,然后在绑定表达式中引用它。

<Window x:Class="WpfConverterDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:converters="clr-namespace:WpfConverterDemo.Converters"
        Title="值转换器示例" Height="350" Width="500">
    
    <!-- 定义资源 -->
    <Window.Resources>
        <!-- 声明转换器实例 -->
        <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
    </Window.Resources>
    
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <!-- 控制检查框 -->
        <CheckBox Grid.Row="0" Content="显示详细信息" 
                  x:Name="ShowDetailsCheckBox" 
                  IsChecked="False" 
                  Margin="0,0,0,10"/>
        
        <!-- 使用转换器的元素 -->
        <TextBlock Grid.Row="1" 
                   Text="这是标准信息,总是可见。" 
                   Margin="0,0,0,10"/>
        
        <!-- 详细信息面板,可见性由CheckBox控制 -->
        <Border Grid.Row="2" 
                BorderBrush="LightGray" 
                BorderThickness="1" 
                Padding="10"
                Visibility="{Binding IsChecked, ElementName=ShowDetailsCheckBox, 
                            Converter={StaticResource BoolToVisibilityConverter}}">
            <TextBlock TextWrapping="Wrap">
                这是详细信息,只有在上方的复选框被选中时才会显示。<LineBreak/>
                通过使用BoolToVisibilityConverter,我们可以轻松地将复选框的状态转换为可见性值。
            </TextBlock>
        </Border>
    </Grid>
</Window>

在上面的示例中,我们定义了一个BoolToVisibilityConverter实例作为窗口资源,然后在Border元素的Visibility属性绑定中使用它。这样,当复选框被选中时,详细信息面板会显示;当复选框未被选中时,面板会隐藏。

转换器参数(ConverterParameter)

有时我们需要为转换器提供额外的信息来控制其行为。这时可以使用ConverterParameter参数。在绑定表达式中,使用ConverterParameter属性指定参数:

<TextBlock Visibility="{Binding IsEnabled, 
                       Converter={StaticResource BoolToVisibilityConverter}, 
                       ConverterParameter=Invert}"/>

在这个例子中,我们传递了一个名为"Invert"的参数给转换器,这将反转转换逻辑。这意味着,当IsEnabled为true时,元素将被隐藏;当IsEnabled为false时,元素将被显示。

常用转换器实现

下面是一些在WPF应用中常用的值转换器实现:

布尔值转可见性(BoolToVisibilityConverter)

这个转换器我们已经在前面的示例中看到了。它将布尔值转换为Visibility枚举,通常用于根据条件显示或隐藏UI元素。

数值转换(NumberConverter)

这个转换器处理数值之间的转换,例如将一个数字乘以一个系数,或者将百分比转换为实际值:

using System;
using System.Globalization;
using System.Windows.Data;

namespace WpfConverterDemo.Converters
{
    /// <summary>
    /// 处理数值转换的转换器
    /// 可以将数值乘以指定系数,或者添加偏移量
    /// </summary>
    public class NumberConverter : IValueConverter
    {
        /// <summary>
        /// 将数值按照指定方式转换
        /// </summary>
        /// <param name="value">要转换的数值</param>
        /// <param name="targetType">目标类型</param>
        /// <param name="parameter">转换参数,格式为"operation:value",如"multiply:2"或"add:10"</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>转换后的数值</returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 确保值是数字
            if (!(value is double || value is int || value is float || value is decimal))
                return 0;
            
            // 将值转换为double
            double doubleValue = System.Convert.ToDouble(value);
            
            // 如果没有参数,直接返回值
            if (parameter == null)
                return doubleValue;
            
            string paramStr = parameter.ToString();
            
            // 解析参数
            if (paramStr.StartsWith("multiply:"))
            {
                string multiplierStr = paramStr.Substring("multiply:".Length);
                if (double.TryParse(multiplierStr, out double multiplier))
                {
                    return doubleValue * multiplier;
                }
            }
            else if (paramStr.StartsWith("add:"))
            {
                string addendStr = paramStr.Substring("add:".Length);
                if (double.TryParse(addendStr, out double addend))
                {
                    return doubleValue + addend;
                }
            }
            
            // 默认返回原值
            return doubleValue;
        }

        /// <summary>
        /// 将转换后的数值转换回原始数值
        /// </summary>
        /// <param name="value">转换后的数值</param>
        /// <param name="targetType">目标类型</param>
        /// <param name="parameter">转换参数,格式为"operation:value",如"multiply:2"或"add:10"</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>原始数值</returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 确保值是数字
            if (!(value is double || value is int || value is float || value is decimal))
                return 0;
            
            // 将值转换为double
            double doubleValue = System.Convert.ToDouble(value);
            
            // 如果没有参数,直接返回值
            if (parameter == null)
                return doubleValue;
            
            string paramStr = parameter.ToString();
            
            // 解析参数并执行反向操作
            if (paramStr.StartsWith("multiply:"))
            {
                string multiplierStr = paramStr.Substring("multiply:".Length);
                if (double.TryParse(multiplierStr, out double multiplier) && multiplier != 0)
                {
                    return doubleValue / multiplier;
                }
            }
            else if (paramStr.StartsWith("add:"))
            {
                string addendStr = paramStr.Substring("add:".Length);
                if (double.TryParse(addendStr, out double addend))
                {
                    return doubleValue - addend;
                }
            }
            
            // 默认返回原值
            return doubleValue;
        }
    }
}

使用示例:

<!-- 将Slider的值(0-1)乘以100转换为百分比 -->
<Slider x:Name="percentSlider" Minimum="0" Maximum="1" Value="0.5" />
<TextBlock Text="{Binding Value, ElementName=percentSlider, 
           Converter={StaticResource NumberConverter}, 
           ConverterParameter=multiply:100, 
           StringFormat={}{0}%}" />

字符串格式化(StringFormatConverter)

虽然WPF绑定已经内建了StringFormat支持,但有时我们需要更复杂的字符串格式化逻辑:

using System;
using System.Globalization;
using System.Windows.Data;

namespace WpfConverterDemo.Converters
{
    /// <summary>
    /// 用于高级字符串格式化的转换器
    /// </summary>
    public class StringFormatConverter : IValueConverter
    {
        /// <summary>
        /// 将值格式化为字符串
        /// </summary>
        /// <param name="value">要格式化的值</param>
        /// <param name="targetType">目标类型(通常是string)</param>
        /// <param name="parameter">格式字符串,例如"¥{0:N2}"</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>格式化后的字符串</returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 如果值为null,返回空字符串
            if (value == null)
                return string.Empty;
            
            // 如果没有提供格式参数,返回值的字符串表示
            if (parameter == null)
                return value.ToString();
            
            // 使用提供的格式字符串格式化值
            try
            {
                return string.Format(culture, parameter.ToString(), value);
            }
            catch (Exception)
            {
                // 如果格式化失败,返回原始值的字符串表示
                return value.ToString();
            }
        }

        /// <summary>
        /// 不支持从字符串转换回原始值
        /// </summary>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 字符串格式化通常是单向的,不支持反向转换
            throw new NotSupportedException("StringFormatConverter不支持反向转换");
        }
    }
}

使用示例:

<!-- 格式化价格显示 -->
<TextBlock Text="{Binding Price, 
           Converter={StaticResource StringFormatConverter}, 
           ConverterParameter=价格: ¥{0:N2}}" />

枚举转文本(EnumToStringConverter)

这个转换器将枚举值转换为更友好的显示文本:

using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Windows.Data;

namespace WpfConverterDemo.Converters
{
    /// <summary>
    /// 将枚举值转换为友好显示文本的转换器
    /// 支持使用Description特性来自定义显示文本
    /// </summary>
    public class EnumToStringConverter : IValueConverter
    {
        /// <summary>
        /// 将枚举值转换为字符串
        /// </summary>
        /// <param name="value">要转换的枚举值</param>
        /// <param name="targetType">目标类型(通常是string)</param>
        /// <param name="parameter">可选参数,不使用</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>枚举值的友好显示文本</returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 如果值为null,返回空字符串
            if (value == null)
                return string.Empty;
            
            // 确保值是枚举
            if (!value.GetType().IsEnum)
                return value.ToString();
            
            // 获取枚举值
            Enum enumValue = (Enum)value;
            
            // 尝试获取Description特性
            string description = GetEnumDescription(enumValue);
            
            // 如果有Description特性,返回其值,否则返回枚举名称
            return !string.IsNullOrEmpty(description) ? description : enumValue.ToString();
        }

        /// <summary>
        /// 将字符串转换回枚举值
        /// </summary>
        /// <param name="value">要转换的字符串</param>
        /// <param name="targetType">目标枚举类型</param>
        /// <param name="parameter">可选参数,不使用</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>对应的枚举值</returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 如果值为null或不是字符串,返回默认枚举值
            if (value == null || !(value is string))
                return Enum.GetValues(targetType).GetValue(0);
            
            string stringValue = (string)value;
            
            // 尝试通过枚举名称解析
            if (Enum.IsDefined(targetType, stringValue))
                return Enum.Parse(targetType, stringValue);
            
            // 尝试通过Description特性查找
            foreach (var enumValue in Enum.GetValues(targetType))
            {
                if (GetEnumDescription((Enum)enumValue) == stringValue)
                    return enumValue;
            }
            
            // 如果找不到匹配,返回默认枚举值
            return Enum.GetValues(targetType).GetValue(0);
        }
        
        /// <summary>
        /// 获取枚举值的Description特性值
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <returns>Description特性值,如果不存在则返回null</returns>
        private string GetEnumDescription(Enum value)
        {
            // 获取字段信息
            FieldInfo field = value.GetType().GetField(value.ToString());
            
            // 获取Description特性
            DescriptionAttribute attribute = Attribute.GetCustomAttribute(
                field, typeof(DescriptionAttribute)) as DescriptionAttribute;
            
            // 返回Description值,如果没有特性则返回null
            return attribute?.Description;
        }
    }
}

使用示例:

首先,定义一个带有Description特性的枚举:

public enum OrderStatus
{
    [Description("等待支付")]
    WaitingForPayment,
    
    [Description("处理中")]
    Processing,
    
    [Description("已发货")]
    Shipped,
    
    [Description("已完成")]
    Completed,
    
    [Description("已取消")]
    Canceled
}

然后在XAML中使用转换器:

<!-- 显示订单状态 -->
<TextBlock Text="{Binding CurrentStatus, 
           Converter={StaticResource EnumToStringConverter}}" />

多值转换器(IMultiValueConverter)

除了IValueConverter外,WPF还提供了另一个接口IMultiValueConverter,用于处理多个源值到一个目标值的转换。

接口定义

public interface IMultiValueConverter
{
    object Convert(object[] values, Type targetType, object parameter, CultureInfo culture);
    object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture);
}

实现示例

下面是一个示例,它将三个颜色分量(红、绿、蓝)合并成一个SolidColorBrush

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;

namespace WpfConverterDemo.Converters
{
    /// <summary>
    /// 将RGB分量转换为SolidColorBrush的多值转换器
    /// </summary>
    public class RgbToBrushConverter : IMultiValueConverter
    {
        /// <summary>
        /// 将RGB分量转换为SolidColorBrush
        /// </summary>
        /// <param name="values">RGB值数组(应包含3个0-255之间的整数)</param>
        /// <param name="targetType">目标类型(应为SolidColorBrush)</param>
        /// <param name="parameter">可选参数,不使用</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>包含指定RGB颜色的SolidColorBrush</returns>
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            // 检查是否有足够的值
            if (values == null || values.Length < 3)
                return new SolidColorBrush(Colors.Black);
            
            // 尝试解析RGB值
            byte r = ParseColorComponent(values[0]);
            byte g = ParseColorComponent(values[1]);
            byte b = ParseColorComponent(values[2]);
            
            // 创建颜色对象
            Color color = Color.FromRgb(r, g, b);
            
            // 返回颜色画刷
            return new SolidColorBrush(color);
        }

        /// <summary>
        /// 将SolidColorBrush转换回RGB分量
        /// </summary>
        /// <param name="value">要转换的SolidColorBrush</param>
        /// <param name="targetTypes">目标类型数组</param>
        /// <param name="parameter">可选参数,不使用</param>
        /// <param name="culture">当前区域性信息</param>
        /// <returns>包含RGB分量的数组</returns>
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            // 检查输入是否为SolidColorBrush
            if (!(value is SolidColorBrush brush))
                return new object[] { 0, 0, 0 };
            
            // 获取颜色
            Color color = brush.Color;
            
            // 返回RGB分量
            return new object[] { color.R, color.G, color.B };
        }
        
        /// <summary>
        /// 将对象解析为颜色分量(0-255的字节值)
        /// </summary>
        /// <param name="value">要解析的对象</param>
        /// <returns>颜色分量值</returns>
        private byte ParseColorComponent(object value)
        {
            // 尝试转换为数值
            if (value is byte byteValue)
                return byteValue;
            
            if (int.TryParse(value?.ToString(), out int intValue))
                return (byte)Math.Clamp(intValue, 0, 255);
            
            if (double.TryParse(value?.ToString(), out double doubleValue))
                return (byte)Math.Clamp(doubleValue, 0, 255);
            
            // 默认返回0
            return 0;
        }
    }
}

使用示例:

<Window.Resources>
    <converters:RgbToBrushConverter x:Key="RgbToBrushConverter"/>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    
    <!-- RGB滑块 -->
    <StackPanel Grid.Row="0" Margin="10">
        <TextBlock Text="红色 (R):" Margin="0,5"/>
        <Slider x:Name="redSlider" Minimum="0" Maximum="255" Value="120"/>
        
        <TextBlock Text="绿色 (G):" Margin="0,10,0,5"/>
        <Slider x:Name="greenSlider" Minimum="0" Maximum="255" Value="180"/>
        
        <TextBlock Text="蓝色 (B):" Margin="0,10,0,5"/>
        <Slider x:Name="blueSlider" Minimum="0" Maximum="255" Value="220"/>
    </StackPanel>
    
    <!-- RGB值显示 -->
    <TextBlock Grid.Row="1" Margin="10" HorizontalAlignment="Center">
        <TextBlock.Text>
            <MultiBinding StringFormat="RGB: ({0}, {1}, {2})">
                <Binding ElementName="redSlider" Path="Value" />
                <Binding ElementName="greenSlider" Path="Value" />
                <Binding ElementName="blueSlider" Path="Value" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
    
    <!-- 色彩预览 -->
    <Border Grid.Row="2" Margin="10" BorderBrush="Black" BorderThickness="1">
        <Border.Background>
            <MultiBinding Converter="{StaticResource RgbToBrushConverter}">
                <Binding ElementName="redSlider" Path="Value" />
                <Binding ElementName="greenSlider" Path="Value" />
                <Binding ElementName="blueSlider" Path="Value" />
            </MultiBinding>
        </Border.Background>
    </Border>
</Grid>

在这个示例中,我们使用三个滑块来控制颜色的红、绿、蓝分量,然后使用RgbToBrushConverter将这三个值转换为一个SolidColorBrush,应用到Border的背景色。

值转换器的最佳实践

在使用值转换器时,有一些最佳实践可以遵循:

  1. 保持转换器的通用性:编写转换器时,尽量使其具有通用性,以便在多个场景中重用。例如,参数化转换逻辑,以便可以通过ConverterParameter调整行为。

  2. 处理异常情况:转换器应该优雅地处理无效输入,避免抛出异常。提供合理的默认值,以确保UI不会因为数据问题而崩溃。

  3. 考虑性能影响:对于频繁更新的绑定,复杂的转换逻辑可能会影响性能。在这种情况下,考虑简化转换或使用其他技术。

  4. 遵循单一职责原则:每个转换器应该只关注一种转换类型。如果需要多个转换步骤,考虑使用多个转换器或更复杂的解决方案,如转换组。

  5. 文档化:使用注释详细说明转换器的功能和参数用法,这对于维护和团队协作非常重要。

  6. 测试转换器:为转换器编写单元测试,确保它们在各种输入条件下都能正确工作。

总结

值转换器是WPF数据绑定系统中的强大工具,它们使我们能够在不修改源数据或添加复杂逻辑的情况下转换和格式化数据。在本文中,我们探讨了:

  1. 值转换器的基本概念和工作原理
  2. 如何实现IValueConverter接口
  3. 如何在XAML中使用转换器
  4. 如何使用转换器参数控制转换逻辑
  5. 常见转换器的实现示例
  6. 多值转换器的使用
  7. 值转换器的最佳实践

通过掌握这些概念和技术,您可以创建更灵活、更强大的WPF应用程序,同时保持代码的清晰和可维护性。

数据绑定
源数据
转换器
目标UI元素
IValueConverter
IMultiValueConverter
Convert方法
ConvertBack方法
Convert多值方法
ConvertBack多值方法
应用场景
类型转换
值格式化
显示逻辑
数据验证

参考资料

  • Microsoft Docs: 数据绑定概述
  • CodeProject: WPF Converters Collection

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qml中的TextArea使用QSyntaxHighlighter显示高亮语法

效果图&#xff0c;左侧显示行号&#xff0c;右侧用TextArea显示文本内容&#xff0c;并且语法高亮。 2025年5月8号更新 1、多行文本注释 多行文本注释跟普通的高亮规则代码不太一样&#xff0c;代码需要修改&#xff0c;这里以JavaScript举例。 先制定多行文本注释规则&…

Transformer编码器+SHAP分析,模型可解释创新表达!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基本介绍 基于SHAP分析的特征选择和贡献度计算&#xff0c;Matlab2023b代码实现&#xff1b;基于MATLAB的SHAP可解释Transformer编码器回归模型&#xff0c;敏感性分析方法。 详细介绍 引言 在正向渗透&#xff08…

[特殊字符]适合母亲节的SVG模版[特殊字符]

宝藏模版 往期推荐&#xff08;点击阅读&#xff09;&#xff1a; 趣味效果&#xff5c;高大上&#xff5c;可爱风&#xff5c;年终总结I&#xff5c;年终总结II&#xff5c;循环特效&#xff5c;情人节I&#xff5c;情人节II&#xff5c;情人节IIII&#xff5c;妇女节I&…

浅蓝色调风格人像自拍Lr调色预设,手机滤镜PS+Lightroom预设下载!

调色教程 浅蓝色调风格人像自拍 Lr 调色是利用 Adobe Lightroom 软件针对人像自拍照进行后期处理的一种调色方式。它通过对照片的色彩、对比度、亮度等参数进行精细调整&#xff0c;将画面的主色调打造为清新、柔和的浅蓝色系&#xff0c;赋予人像自拍独特的清新、文艺风格&…

isp流程介绍(yuv格式阶段)

一、前言介绍 前面两章里面&#xff0c;已经分别讲解了在Raw和Rgb域里面&#xff0c;ISP的相关算法流程&#xff0c;从前面文章里面可以看到&#xff0c;在Raw和Rgb域里面&#xff0c;很多ISP算法操作&#xff0c;更像是属于sensor矫正或者说sensor标定操作。本质上来说&#x…

数巅智能携手北京昇腾创新中心深耕行业大模型应用

当前&#xff0c;AI技术正在加速向各行业深度渗透,成为驱动产业转型和社会经济发展的重要引擎。构建开放协作的AI应用生态体系、推动技术和应用深度融合&#xff0c;已成为行业发展的重要趋势。 近日&#xff0c;数巅智能与北京昇腾人工智能计算中心&#xff08;北京昇腾创新中…

【LangChain高级系列】LangGraph第一课

前言 我们今天直接通过一个langgraph的基础案例&#xff0c;来深入探索langgraph的核心概念和工作原理。 基本认识 LangGraph是一个用于构建具有LLMs的有状态、多角色应用程序的库&#xff0c;用于创建代理和多代理工作流。与其他LLM框架相比&#xff0c;它提供了以下核心优…

常见降维算法分析

一、常见的降维算法 LDA线性判别PCA主成分分析t-sne降维 二、降维算法原理 2.1 LDA 线性判别 原理 &#xff1a;LDA&#xff08;Linear Discriminant Analysis&#xff09;线性判别分析是一种有监督的降维方法。它的目标是找到一个投影方向&#xff0c;使得不同类别的数据在…

计算机二级(C语言)已过

非线性结构&#xff1a;树、图 链表和队列的结构特性不一样&#xff0c;链表可以在任何位置插入、删除&#xff0c;而队列只能在队尾入队、队头出队 对长度为n的线性表排序、在最坏情况下时间复杂度&#xff0c;二分查找为O(log2n)&#xff0c;顺序查找为O(n)&#xff0c;哈希查…

2025年3月,​韩先超对国网宁夏进行Python线下培训

大家好&#xff0c;我是韩先超&#xff01;在2025年3月3号和4号&#xff0c;为 宁夏国网 的运维团队进行了一场两天的 Python培训 &#xff0c;培训目标不仅是让大家学会Python编程&#xff0c;更是希望大家能够通过这门技术解决实际工作中的问题&#xff0c;提升工作效率。 对…

[计算机网络]物理层

文章目录 物理层的概述与功能传输介质双绞线:分类:应用领域: 同轴电缆&#xff1a;分类: 光纤&#xff1a;分类: 无线传输介质&#xff1a;无线电波微波&#xff1a;红外线&#xff1a;激光&#xff1a; 物理层设备中继器(Repeater)&#xff1a;放大器&#xff1a;集线器(Hub)&…

幂等操作及处理措施

利用token模式去避免幂等操作 按以上图所示&#xff0c;除了token,应该也可以把传入的参数用MD5加密&#xff0c;当成key放入redis里面&#xff0c;业务执行完后再删除这个key.如还没有执行完&#xff0c;则请不要重复操作。纯属个人理解

Matlab 数控车床进给系统的建模与仿真

1、内容简介 Matlab217-数控车床进给系统的建模与仿真 可以交流、咨询、答疑 2、内容说明 略 摘 要:为提高数控车床的加工精度,对数控 车床进给系统中影响加工精度的主要因素进行了仿真分析研 动系统的数学模型,利用MATLAB软件中的动态仿真工具 究:依据机械动力学原理建立了…

低成本自动化改造的18个技术锚点深度解析

执行摘要 本文旨在深入剖析四项关键的低成本自动化技术&#xff0c;这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导&#xff0c;涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率&#xff08;ROI&#xff09;的严谨…

我国脑机接口市场规模将破38亿元,医疗领域成关键突破口

当人类仅凭"意念"就能操控无人机编队飞行&#xff0c;当瘫痪患者通过"脑控"重新站立行走&#xff0c;这些曾只存在于科幻电影的场景&#xff0c;如今正通过脑机接口技术变为现实。作为"十四五"规划中重点发展的前沿科技&#xff0c;我国脑机接口…

Edu教育邮箱申请成功下号

这里是第2部分 如你所见&#xff0c;我根本就没有考虑流量的问题&#xff0c; 如果你有幸看到前面的内容&#xff0c;相信你能自己找到这个后续。

【Linux进程控制一】进程的终止和等待

【Linux进程控制一】进程的终止和等待 一、进程终止1.main函数的return2.strerror函数3.库函数exit4.系统调用_exit和库函数exit的区别5.异常信号6.变量errno 二、进程等待1.什么是进程等待&#xff1f;2.wait接口3.status4.waitpid接口 一、进程终止 1.main函数的return 写C…

今日行情明日机会——20250509

上证指数今天缩量&#xff0c;整体跌多涨少&#xff0c;走势处于日线短期的高位~ 深证指数今天缩量小级别震荡&#xff0c;大盘股表现更好~ 2025年5月9日涨停股主要行业方向分析 一、核心主线方向 服装家纺&#xff08;消费复苏出口链驱动&#xff09; • 涨停家数&#xf…

单片机-STM32部分:10、串口UART

飞书文档https://x509p6c8to.feishu.cn/wiki/W7ZGwKJCeiGjqmkvTpJcjT2HnNf 串口说明 电平标准是数据1和数据0的表达方式&#xff0c;是传输线缆中人为规定的电压与数据的对应关系&#xff0c;串口常用的电平标准有如下三种&#xff1a; TTL电平&#xff1a;3.3V或5V表示1&am…

RabittMQ-高级特性2-应用问题

文章目录 前言延迟队列介绍ttl死信队列存在问题延迟队列插件安装延迟插件使用事务消息分发概念介绍限流非公平分发&#xff08;负载均衡&#xff09; 限流负载均衡RabbitMQ应用问题-幂等性保障顺序性保障介绍1顺序性保障介绍2消息积压总结 前言 延迟队列介绍 延迟队列(Delaye…