1

我正在 WPF 中设计一个产品模拟器。我们公司销售一种手持式电子医疗设备,我们想尝试使用“虚拟”、蒙皮(某种)GUI 来表示按钮和 LED 的用户交互。

有没有办法“强制”WPF 在屏幕上显示具有真实世界尺寸的东西(通过获取监视器 dpi 信息或类似的东西)?

再举一个例子,假设我可以使用 WPF 控件(DockPanels、Labels、Canvases 等)来布置一张塑料的、标准尺寸的信用卡,我能否在不同的台式机/笔记本电脑上以真实信用卡的尺寸一致地显示它?

更新:

ViewBox通过使用 a作为窗口的 LayoutRoot,我找到了一种巧妙的方法来设计“真正的毫米”。内部任何东西的大小都可以“以毫米为单位设计”,并且将以物理大小显示,前提是我可以获得 ViewBox 的正确像素大小。这仍然是一个谜:

  • 我桌面上的像素和毫米之间的关系似乎是 3.5(这个数字是从哪里来的?
  • 如何实现代码隐藏的 DataBound 属性或 ValueConverter,以便我可以定义缩放级别(通过滑块或硬编码)以在需要时显示设备的缩放(更大)版本?
4

1 回答 1

1

我“有点”用以下策略解决了这个问题:

  • 我的 MainWindow 有一个 ViweBox 作为 LayoutRoot,它的 Child 是一些代表物理对象的容器控件(在本例中为边框);
  • ViewBox 和其中的所有内容都被定义为 WPF 单位是毫米。因此,如果产品的物理宽度为 68mm,则容器控件的 Width 属性为 78。嵌套在其中的所有其他内容都被视为 WPF 单位是实际的毫米;
  • ViewBox 的 Width 和 Height 使用乘以 (96/25.4) 的 ValueConverter 绑定到容器控件的 Height 和 Width;
  • 由于视图框内的所有内容都被缩放以适应(ViewBox.Stretch=Uniform),因此值转换器只是调整了视图框的大小,其余的布局调整由 ViewBox 嵌入式渲染转换实现(我认为它足够高效)。

我的 XAML:

<Window.Resources>
    <local:PixelsToMilimeters x:Key="SizeConverter"/>       
</Window.Resources>

<Viewbox x:Name="LayoutRoot" Stretch="Uniform"
    Width="{Binding Width, ElementName=Case, Converter={StaticResource SizeConverter}}"
    Height="{Binding Height, ElementName=Case, Converter={StaticResource SizeConverter}}">
    <Border x:Name="Case" Width="108" Height="68">
    (...)

我的代码隐藏:

    (...)
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value * (96/25.4);
    }
    (...)

当然是“我怎么能确定 DPI 实际上是 96?” 没有解决,但可以封装,最终结果与预期的结果足够接近,就我的目的而言。

于 2013-04-19T20:56:07.240 回答