首先我要说明一下,是的,这里有大量“与分辨率无关的C#WPF布局”相关的问题。我的问题与此没有直接关系,我已经阅读了大部分内容,并阅读了几个教程。
目标:
由于我是WPF的新手,我的目标是有一个明确的方法来设计一个独立的屏幕分辨率的复杂,逼真的GUI,并在用户调整窗口大小时适当缩放。
混淆原因:
我对许多教程和stackoverflow帖子建议的大量选项感到困惑,使用Viewbox,流动布局,相对布局,使用不同类型的容器,以及WPF应该是设计独立于分辨率的事实。
问题:
我没有任何打算开始辩论的意图,我知道不是为了那个。我只是想知道我计划用来设计我的真实GUI的这个程序是否正确。
1>在Illustrator中设计样机(或直接在Blend中设计,我不知道应该使用哪个)
2>通过拖放和复制来复制它使用(不知道哪个)布局
设计1024 x 768分辨率时,WPF中的丢弃设计3>当我的用户启动我的应用程序时,通过做一些数学来获取屏幕大小并调整每个控件的大小(Yukh!这真的是我必须要做的吗?WPF的独立性是什么意思,那不是真正的拖放设计是吗?)
我的大多数应用程序都是数据库驱动的数据输入和操作表单。我使用的是行业中常见的正确策略,还是我错过了什么?
非常感谢
答案 0 :(得分:6)
WPF非常容易与分辨率无关的一个原因是它提供了布局控制。
如果您是WPF的新手并且不知道还存在哪些布局控件,我强烈建议您查看this quick visual start,其中演示了不同的布局面板以及它们如何调整/安排他们的孩子。
构建GUI的典型方法是:
这里有几点需要注意:
大多数元素在WPF中的大小或位置都不是绝对的。 WPF的布局面板通常控制其中元素的大小或位置,因此通常使用面板来布局控件,而不是每个控件都有单独的大小和位置。
不使用拖放WPF编辑器。这是因为它经常为您的控件添加不必要的大小,位置和边距,这使您的XAML成为阅读和维护的噩梦。让小组在确定子项元素的大小和位置方面做得更好。
这并不意味着你根本无法调整元素的大小或位置,但通常你会为尺寸和位置设置相对属性而不是绝对元素,让你的Panel做大量工作来确定绘制元素的位置,和它们有多大。
对于定位,使用HorizontalAlignment
或VerticalAlignment
等相对属性而不是Canvas.Top
/ Canvas.Left
或非自然大Margins
等绝对属性,尽管大多数布局面板负责以特定方式定位元素,因此大多数元素都不需要。
对于尺寸调整,这意味着设置MaxHeight
或MinWidth
,而不是为您的元素定义绝对Height
/ Width
,或者使用网格的星号尺寸来调整相对大小元素占屏幕的百分比。
答案 1 :(得分:2)
3>当我的用户启动我的应用程序时,获取屏幕大小并调整大小 通过做一些数学的每一个控制
不,不,不要手动调整任何大小。使用布局,例如简单的Grid
。
您可以定义行和列。例如:
<Grid Margin="5">
<Grid.ColumnDefinition>
<ColumnDefinition Height="Auto" />
<ColumnDefinition Height="20" />
<ColumnDefinition Height="*" />
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="some text" />
<TextBox Grid.Row="1" />
<Label Grid.Row="2" />
</Grid>
您有一个自动调整大小的列(即大小将是Label
的大小),固定大小的列(20)以及使用所有剩余空间的最后一列。因此,基本上在调整窗口大小时,最后一列的大小将使用更多或更少的空间。
有关WPF中布局的更多提示/示例,请参阅link。
答案 2 :(得分:2)
在Illustrator中设计样机(或直接在Blend中设计,我不知道应该使用哪个)
同意,如果那是你滚动的方式。我倾向于直接在VS中做更容易的事情,并在需要时使用Blend。
通过拖动和复制来复制它使用(不知道哪个)布局
设计1024 x 768分辨率时,WPF中的丢弃设计
我仍然不能推荐WPF的设计师。这在2010年非常糟糕。2012年它可能会好得多,但我没有任何理由去尝试,因为我已经习惯于写XAML了。
当我的用户启动我的应用程序时,通过做一些数学来获取屏幕大小并调整每个控件的大小(Yukh!这真的是我必须这样做吗?WPF的独立性是什么意思,那不是真的拖放设计是吗?)
绝对不是。使用WPF's layout system为您完成艰苦的工作。其基础是Panel
,它可以决定给孩子提供什么样的空间。 WPF的Grid
控件(Panel
)非常灵活,允许您为行和列指定比例大小,从而确保您的布局可以合理的方式扩展和收缩。
但是,您始终需要记住最小尺寸。显然你不能指望你的用户界面在10x10时看起来还不错!您可以使用MinWidth
和MinHeight
属性来控制此项,直至您Window
的级别。
答案 3 :(得分:1)
我将假设通过“解决方案独立性”,您希望应用程序使用可用的所有空间。
有两种主要方法可以实现这一目标,一种是简单的,一种是正确的; - )
使用此选项,您将为用户界面设计固定布局。然后应用缩放变换以确保UI占据整个窗口。
要在WPF中执行此操作,只需将UI中的所有内容包装在Viewbox:
中<Viewbox>
<RestOfYourUI />
</Viewbox>
<强>优点:强>
<强>缺点:强>
这就是网页设计师所说的“responsive design”,只是意味着您修改了UI的整个布局和内容,以匹配当前设备(或屏幕/窗口)的大小和分辨率。
这需要付出更多努力,但最终结果是IMO要好得多。没有任何简单的清单,但实现这一目标的一些技巧是:
<强>优点:强>
<强>缺点:强>
就个人情况而言,除了极少数情况外,我总是选择2。