是否可以在真实的,与设备无关的单元中显示WPF控件?例如毫米?

时间:2013-04-19 19:04:50

标签: wpf layout screen-resolution

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

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

另一个例子,假设我可以使用WPF控件(DockPanels,Labels,Canvases等)布局塑料,标准尺寸的信用卡,我可以在不同桌面上使用真实信用卡的尺寸始终如一地显示它/笔记本电脑?

更新:

通过使用ViewBox作为我窗口的LayoutRoot,我找到了一种设计“真实毫米”的聪明方法。内部任何东西的大小都可以“以毫米为单位”设计,并且将以物理尺寸显示,以便我可以为ViewBox获得正确的像素大小。而且仍然存在一定的误区:

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

1 个答案:

答案 0 :(得分:1)

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

  • 我的MainWindow有一个ViweBox作为LayoutRoot,它的Child是一个容器控件(在这种情况下是Border),代表物理对象;
  • ViewBox及其中的所有内容都定义为WPF单位为毫米。因此,如果产品的物理宽度为68mm,则容器控件的Width属性为78.嵌套在其中的所有其他内容都被视为WPF单位是实际的毫米;
  • ViewBox的宽度和高度限制为容器控件的高度和宽度,使用ValueConverter乘以(96 / 25.4);
  • 由于视图框内的所有内容都缩放以适合(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?”没有解决,但可以封装,最终的结果足够接近预期的,为了我的目的。