【问题标题】:cast string to location将字符串投射到位置
【发布时间】:2017-03-10 19:46:02
【问题描述】:

当我使用标准 Control.Location.ToString 方法将控件的位置导出为字符串时,我得到以下信息:

{X=163,Y=196}

如何将此字符串转回位置?有没有开箱即用的功能,还是我需要自己解析这个字符串自己做?

更新: 我想将屏幕上的一些对象序列化为 XML 以保存进度并稍后再读取。

【问题讨论】:

  • 那个字符串是从哪里来的?它不能“强制转换”,但也许可以在上游做一些事情来轻松转换它
  • @Plutonix 我假设他是从Control's.Location 属性中做到的。不过,他当然必须以这种方式输出。
  • 是的,我更感兴趣的是它是她/他生成的东西,还是来自其他地方的东西,他们无法控制或不得不使用该格式来消费@Zaggler跨度>
  • @Plutonix 很有道理,也是一个很好的问题。
  • 如果您正在序列化,序列化程序可以、将会并且应该采用Point 保存它然后再转换回来。 不应该做任何事情。当超过一个人的 cmets 时,您需要使用@ + username 对他们进行 ping,如第二个和第三个 cmets,如果您想让任何人知道您已回复

标签: vb.net winforms controls


【解决方案1】:

如果您正在序列化,那么序列化程序应该处理从Point 到字符串的转换并返回。如果您检查序列化程序的输出,它应该如下所示:727, 97

此表单为InvariantString,NET 提供了无需解析文本即可转换这些表单的方法:

Dim pt = Button10.Location

Dim cvtr = TypeDescriptor.GetConverter(GetType(Point))
' convert Pt to invariant string
Dim strPT = cvtr.ConvertToInvariantString(pt)
Console.WriteLine(strPT)

' try to convert back
Dim pt2 = DirectCast(cvtr.ConvertFromInvariantString(strPT), Point)

If pt.Equals(pt2) Then
    Console.Beep()
End If

输出:

727, 97
(哔)

但同样,序列化程序应该为您转换。


如果您经常这样做,通用版本会很方便:

Private Function CvtToInvariantString(Of T)(item As T) As String
    Dim cvtr = TypeDescriptor.GetConverter(GetType(T))

    Return cvtr.ConvertToInvariantString(item)
End Function

Private Function CvtFromInvariantString(Of T)(str As String) As T
    Dim cvtr = TypeDescriptor.GetConverter(GetType(T))

    Return DirectCast(cvtr.ConvertFromInvariantString(str), T)
End Function

用法:

Dim strPT = CvtToInvariantString(pt)

Dim pt2 = CvtFromInvariantString(Of Point)(strPT)

【讨论】:

  • 确实是我想多了,序列化器按原样导出了point属性,谢谢:)
猜你喜欢
  • 2014-02-13
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2012-08-21
  • 2021-02-10
  • 2018-10-18
相关资源
最近更新 更多