实现PointF和SizeF的属性在PropertyGrid中可编辑的方法

本文介绍如何为.NET中的PointF和SizeF类型创建自定义TypeConverter,使其能在PropertyGrid中实现类似Point类型的直接编辑功能。通过示例代码展示了PointFConverter与SizeFConverter的具体实现方法。
在PropertyGrid中,PointF和SizeF类型的属性是只读的,我分析了DotNet中的Point的定义,编写了2个属性类,以此实现在PropertyGrid中可以象Point那样直接修改数据的功能。
 
PointF属性类的定义:
  
  /// <summary>
  
/// PointFConverter 的摘要说明。
  
/// </summary>

  public class PointFConverter : TypeConverter
  
{
    
// Methods
    public PointFConverter()
    
{
    }

    
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    
{
      
return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
    }

    
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    
{
      
return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType));
    }

    
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    
{
      
if (!(value is string))
      
{
        
return base.ConvertFrom(context, culture, value);
      }

      
string text = ((string) value).Trim();
      
if (text.Length == 0)
      
{
        
return null;
      }

      
if (culture == null)
      
{
        culture 
= CultureInfo.CurrentCulture;
      }

      
char ch = culture.TextInfo.ListSeparator[0];
      
string[] textArray = text.Split(new char[] { ch });
      
float[] numArray = new float[textArray.Length];
      TypeConverter converter 
= TypeDescriptor.GetConverter(typeof(float));
      
for (int i = 0; i < numArray.Length; i++)
      
{
        numArray[i] 
= (float) converter.ConvertFromString(context, culture, textArray[i]);
      }

      
if (numArray.Length != 2)
      
{
        
throw new ArgumentException("格式不正确!");
      }

      
return new PointF(numArray[0], numArray[1]);

    }

    
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    
{
      
if (destinationType == null)
      
{
        
throw new ArgumentNullException("destinationType");
      }

      
if ((destinationType == typeof(string)) && (value is PointF))
      
{
        PointF pointf 
= (PointF) value;
        
if (culture == null)
        
{
          culture 
= CultureInfo.CurrentCulture;
        }

        
string separator = culture.TextInfo.ListSeparator + " ";
        TypeConverter converter 
= TypeDescriptor.GetConverter(typeof(float));
        
string[] textArray = new string[2];
        
int num = 0;
        textArray[num
++= converter.ConvertToString(context, culture, pointf.X);
        textArray[num
++= converter.ConvertToString(context, culture, pointf.Y );
        
return string.Join(separator, textArray);
      }

      
if ((destinationType == typeof(InstanceDescriptor)) && (value is SizeF))
      
{
        PointF pointf2 
= (PointF) value;
        ConstructorInfo member 
= typeof(PointF).GetConstructor(new Type[] typeof(float), typeof(float) });
        
if (member != null)
        
{
          
return new InstanceDescriptor(member, new object[] { pointf2.X, pointf2.Y });
        }

      }

      
return base.ConvertTo(context, culture, value, destinationType);

    }

    
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
    
{
      
return new PointF((float) propertyValues["X"], (float) propertyValues["Y"]);
    }

    
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    
{
      
return true;
    }

    
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    
{
      
return TypeDescriptor.GetProperties(typeof(PointF), attributes).Sort(new string[] "X""Y" });
    }

    
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
    
{
      
return true;
    }

  }

SizeF属性类的定义:
 
  /// <summary>
  
/// SizeFConverter 的摘要说明。
  
/// </summary>

  public class SizeFConverter : TypeConverter
  
{
    
// Methods
    public SizeFConverter()
    
{
    }

    
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    
{
      
return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
    }

    
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    
{
      
return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType));
    }

    
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    
{
      
if (!(value is string))
      
{
        
return base.ConvertFrom(context, culture, value);
      }

      
string text = ((string) value).Trim();
      
if (text.Length == 0)
      
{
        
return null;
      }

      
if (culture == null)
      
{
        culture 
= CultureInfo.CurrentCulture;
      }

      
char ch = culture.TextInfo.ListSeparator[0];
      
string[] textArray = text.Split(new char[] { ch });
      
float[] numArray = new float[textArray.Length];
      TypeConverter converter 
= TypeDescriptor.GetConverter(typeof(float));
      
for (int i = 0; i < numArray.Length; i++)
      
{
        numArray[i] 
= (float) converter.ConvertFromString(context, culture, textArray[i]);
      }

      
if (numArray.Length != 2)
      
{
        
throw new ArgumentException("格式不正确!");
      }

      
return new SizeF(numArray[0], numArray[1]);

    }

    
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    
{
      
if (destinationType == null)
      
{
        
throw new ArgumentNullException("destinationType");
      }

      
if ((destinationType == typeof(string)) && (value is SizeF))
      
{
        SizeF size 
= (SizeF) value;
        
if (culture == null)
        
{
          culture 
= CultureInfo.CurrentCulture;
        }

        
string separator = culture.TextInfo.ListSeparator + " ";
        TypeConverter converter 
= TypeDescriptor.GetConverter(typeof(float));
        
string[] textArray = new string[2];
        
int num = 0;
        textArray[num
++= converter.ConvertToString(context, culture, size.Width);
        textArray[num
++= converter.ConvertToString(context, culture, size.Height);
        
return string.Join(separator, textArray);
      }

      
if ((destinationType == typeof(InstanceDescriptor)) && (value is SizeF))
      
{
        SizeF size2 
= (SizeF) value;
        ConstructorInfo member 
= typeof(SizeF).GetConstructor(new Type[] typeof(float), typeof(float) });
        
if (member != null)
        
{
          
return new InstanceDescriptor(member, new object[] { size2.Width, size2.Height });
        }

      }

      
return base.ConvertTo(context, culture, value, destinationType);

    }

    
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
    
{
      
return new SizeF((float) propertyValues["Width"], (float) propertyValues["Height"]);
    }

    
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    
{
      
return true;
    }

    
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    
{
      
return TypeDescriptor.GetProperties(typeof(SizeF), attributes).Sort(new string[] "Width""Height" });
    }

    
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
    
{
      
return true;
    }

  }

 
使用方法:
 
[Description("位置信息"),
CategoryAttribute (
"1.基础信息"),
TypeConverterAttribute(
typeof(PointFConverter))]
public PointF 位置
{
  
get{return base.位置;}
  
set{base.位置=value;}
}

[Description(
"尺寸信息"),
CategoryAttribute (
"1.基础信息"),
PropertyOrder(
13),
BrowsableAttribute(
false),
TypeConverterAttribute(
typeof(SizeFConverter))]
public SizeF 尺寸
{
  
get{return base.尺寸;}
  
set{base.尺寸=value;}
}
### VisionPro 中 PointF.Empty 方法详解 在 VisionPro 的几何图形库中,`PointF.Empty` 是一个静态属性,用于表示一个具有零值坐标(即 X Y 均为 0)的特殊 `PointF` 对象[^1]。此方法属性通常被用作初始化或比较操作的基础点。 #### 方法定义 `PointF.Empty` 是一个只读静态属性,返回值是一个 `PointF` 类型的对象,其 X Y 属性均设置为 0[^2]。 #### 使用场景 - **初始化**:当需要创建一个默认的 `PointF` 对象时,可以使用 `PointF.Empty` 而不必手动设置 X Y 的值。 - **比较**:在逻辑判断中,可以通过与 `PointF.Empty` 进行比较来验证某个 `PointF` 是否未被初始化或是否处于默认状态。 #### 示例代码 以下是一个简单的代码示例,展示如何使用 `PointF.Empty`: ```csharp using Cognex.VisionPro; class Program { static void Main(string[] args) { // 初始化一个 PointF 对象为 Empty PointF point = PointF.Empty; // 检查是否为空点 if (point == PointF.Empty) { Console.WriteLine("The point is empty."); } else { Console.WriteLine($"Point coordinates: X={point.X}, Y={point.Y}"); } } } ``` #### 注意事项 1. `PointF.Empty` 只是一个特定的 `PointF` 实例,不能直接修改其属性值。 2. 在实际应用中,建议将 `PointF.Empty` 作为默认值或占位符使用,而不是依赖它进行复杂的计算。 #### 技术细节 - **返回类型**:`PointF` - **命名空间**:Cognex.VisionPro - **相关类**:PointF[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值