【问题标题】:Designing forms to work on different resolutions and aspect ratios on Windows CE设计窗体以在 Windows CE 上处理不同的分辨率和纵横比
【发布时间】:2010-01-20 15:44:38
【问题描述】:

我有一个在 Compact Framework 上运行的 .NET 2.0 应用程序。它有一堆不同的形式,最初都是为了在具有特定屏幕分辨率的特定设备上运行而设计的。我现在希望让这个应用程序在其他一些具有非常不同屏幕分辨率的设备上运行(有些设备具有完全相反的纵横比,屏幕现在比它宽高)。我的问题是如何更改我的表单以在这些其他屏幕上看起来不错?

这与在完整框架上设计表单有点不同,因为我必须设计这些表单以占据整个屏幕,因为屏幕非常小。我考虑过为每种类型的屏幕方向创建单独的表单(例如 MyForm_Wide.cs、MyForm_Tall.cs 等)。我希望能够重用非设计师生成的代码,其中包含大量与 UI 控件相关的业务逻辑。也许我可以以某种方式使用部分类来实现这一点(例如 MyForm.cs 以某种方式被编译成 MyForm_Wide.Designer.cs 等)。我真的很想避免为每个屏幕方向专门编译的版本。我考虑过的另一种方法是尝试在运行时根据确定的屏幕尺寸重新排列一些控件。

你们觉得呢?

【问题讨论】:

    标签: c# winforms compact-framework .net-2.0 windows-ce


    【解决方案1】:

    我们使用 Clarius 的 Orientation Aware Control 框架。它不仅解决了外形尺寸问题,还解决了支持它的设备上的方向变化(屏幕旋转)问题。

    相对于传统桌面开发而言,移动开发最独特的方面可能是需要支持越来越多的设备外形尺寸。

    对于专业的移动开发人员来说,设计支持多种外形尺寸、分辨率和屏幕方向的移动应用程序并非易事、耗时且具有挑战性,这已经不是什么新闻了。 .NET Compact Framework v2.0 中内置的停靠和锚定功能还远远不够,这一点也很明显。

    方向感知控件允许设计和编码具有多个布局或皮肤的单个控件或表单,这些布局或皮肤会根据可用的外形尺寸、分辨率和方向在运行时(和设计时)自动应用。其出色的 Visual Studio 表单和用户控件设计器集成以及零代码自适应 UI 行为使 Orientation Aware Control 成为任何面向多种设备的移动商店的必备伴侣,从而恢复您专注于发展业务所需的生产力。

    【讨论】:

    • 这是一个非常有趣的框架。我想如果我要开始一个新项目,我会考虑使用它,但是对于我现有的项目,我有太多现有代码需要切换。
    【解决方案2】:

    由于 c# 设计人员非常“以像素为导向”,因此没有简单的方法来转换您的表单。

    我不知道您要为此付出多少努力,但是如果您有很多时间并且想要一个非常灵活的解决方案,我建议您应该使用某种支持流布局、边框布局等的布局管理器.

    当然,最初的 c# 设计者不会为设计这些灵活的布局管理表单提供太多帮助。

    但是使用布局管理器可能会减慢表单的初始显示速度。如果您想要真正高速的表单显示,您必须在显示表单之前计算表单上所有控件的所有位置。重新排列控件并显示您的表单 - 然而,这需要大量编码并且对于 gui 更改不是很灵活。

    【讨论】:

      【解决方案3】:

      您可能应该将主窗体的“AutoScaleMode”属性设置为“DPI”。

      然后,它的问题是使用锚点并停靠在表单上的特定控件上。如果你这样做,紧凑的框架将把东西放在你认为的地方。

      此外,可以更改表单的“Form Factor”属性,以查看您的表单在不同尺寸和形状的移动设备上的外观。

      【讨论】:

      • 这篇文章应该给你一些关于如何使用Anchors和对接的指点:msdn.microsoft.com/en-us/library/ms229649.aspx
      • 我的表单已经使用 DPI 缩放,我正在根据需要调整锚点和对接。但是,我仍然有几个问题:对于更高分辨率的屏幕,控件的布局看起来不正确(例如,当它们确实不需要时,文本框跨越整个屏幕宽度;在较低分辨率的屏幕上,它们确实需要到)。此外,对于具有不同纵横比的设备,这根本不起作用,因为我知道控件非常宽,但现在需要向下滚动一个垂直滚动条。
      【解决方案4】:

      我想我已经弄清楚我想做什么了。出于某种原因,即使在我的高分辨率设备上,根据 WinForms API,DPI 仍然显示为 96,因此自动缩放没有做任何事情。相反,如果我在我的控件上手动调用Scale,我会让它们完全按照我想要的方式扩展。现在,这并不能完全解决我不想进行任何缩放的情况下的问题,但如果屏幕的纵横比与我最初设计的比例相反,我确实想重新组织我的控件。对于这种情况,我想我会考虑使用不同的布局面板(例如FlowLayoutPanelTableLayoutPanel)来适当地组织控件。

      希望这将有助于任何未来的 Google 员工...

      【讨论】:

      • 只是在这里添加一些额外的信息,我之前提到的 FlowLayoutPanel 和 TableLayoutPanel 在紧凑框架上不可用(我应该已经看到了)。我真正想要的只是让 VS 的设计器基本上为不同的分辨率生成多个 InitializeComponent 方法。然后在我的表单构造函数中,我可以简单地选择调用哪一个。不幸的是,我找不到这样做的方法。也许我需要考虑创建一个执行此操作的 VS 插件...
      • 我在此主题上找到了以下 Microsoft 文章:msdn.microsoft.com/en-us/library/ms838174.aspx 它适用于 VS .NET 2003,但似乎他们在任何后续版本中都没有真正解决此问题。他们基本上是说您应该创建 Portrait 和 Landscape 方法,并将 VS 设计器为每个布局生成的代码复制到适当的方法中。除了复制整个 InitializeComponent 方法之外,我有点遵循这种方法,因为仅选择大小/位置代码太难了。
      【解决方案5】:

      标签上的“自动大小”属性在外形尺寸之间切换时也会出现问题 - 顺便说一句 - 所以我将其设置为 false。

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2012-10-06
        • 1970-01-01
        相关资源
        最近更新 更多