【问题标题】:WPF Units and Code-BehindWPF 单元和代码隐藏
【发布时间】:2012-03-19 06:23:14
【问题描述】:

最近我发现 WPF 在 XAML 中支持不同的度量单位。除了默认的 DIP,还支持像素、英寸和厘米(据我所知)。这允许设计人员编写这样的 XAML:

<Canvas>
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/>
</Canvas>

但是,您不能绑定这些值。想象一下,我们有一个具有 Dimension 属性的 ViewModel,它是一个字符串,例如“7cm”。以下不起作用:

<Button Width="{Binding Dimension}">Test</Button>

FormatException 被抛出。同样,在代码隐藏中创建FrameworkElement 时,如下所示:

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"});

编译失败,因为在构造函数/尝试创建控件的任何位置引发异常。

我想知道:

  • 是否可以在代码隐藏中使用自然单位(在我的例子中是公制 - 厘米)?
  • 怎么样?
  • 是否有 WPF/XAML 支持的单元的完整列表?

编辑:

这是来自下面评论的链接,它解决了这个问题:

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

【问题讨论】:

    标签: wpf xaml units-of-measurement density-independent-pixel


    【解决方案1】:

    您可以通过应用 XAML 解析器使用的相同转换在代码中执行此操作,如果您不介意传递字符串,则无需重新实现此逻辑:

    button.Width = (double)new LengthConverter().ConvertFrom("2cm");
    

    XAML 解析器使用TypeConverters 将字符串转换为所需的值,在documentation page of the Width property 中,您可以看到它有一个TypeConverterAttribute,指定应该使用LengthConverter。此属性可用于在本地覆盖应如何处理属性,但也可在类级别应用,因此如果Employee 类具有此属性,指定应使用EmployeeConverter,则该转换器将是默认值对于Employee 类型的属性。

    我有点惊讶绑定没有应用这个类型转换器,但是在IValueConverter 中使用它会很简单,事实上你可以创建一个markup extension,它从一个类型转换器构造一个IValueConverter让它非常通用。

    【讨论】:

      【解决方案2】:

      对于 1) 和 2) 由于 DIP 与设备无关,因此您可以毫无问题地计算任何“自然单位”。例外是(不自然:)设备相关像素。

      创建一个ValueConverter,将字符串值转换为双精度值,您可以在字符串中指定所需的单位。然后,您可以在 Binding 中使用 ValueConverter 并在 ViewModel 中以“自然单位”进行计算。

      对于 3) 和实现:我很快搜索了一下,什么也没找到,但也许更深入的搜索会显示一些东西。否则,创建自己的转换器应该不是很困难。这里有一些转换信息:

      96DIP == 1inch == 2.54cm;
      1cm == 37.8DIP;
      1zoll == 1inch == 2.54cm;
      

      【讨论】:

      • 我认为转换器可能是一种方法。但是在我自己写之前,你认为有没有办法确定 XAML 解析器使用什么转换器?我认为 WPF 中必须有一个内置转换器,因为 XAML 支持这个单元。所以我更喜欢使用内置的,我只是想不出一种方法来确定它是哪一个。一些堆栈跟踪调查可能?我真的不知道,有什么想法吗? :)
      • @Aaron:我也喜欢使用现有的元素,但是对于我向谷歌询问的每个转换器,我很快就找到了类名。但在这种特定情况下,谷歌无话可说。为了检测 wpf 中使用的转换器,我无能为力。我从来没有深入研究过整箱。也许这值得一个专门的问题:如何跟踪 WPF 使用哪个 ValueConverter 进行特定转换?
      • 感谢您的回答。我会尝试自己找出一个正确的转换器,如果我失败了,可能会问一个新问题。再次感谢!
      • @HCL:你可能对我的回答感兴趣
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2010-10-20
      • 2011-04-21
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多