开发与分辨率无关的应用程序的技巧
找到工作区测量值并在代码中设置一些属性以便将其绑定到 xaml 中 Control 的边距或高度/宽度属性是一个好习惯吗?
我这样做是为了让我的窗口根据可用的工作区域调整大小。
const int w = SystemParameters.WorkArea.Width;
const int h = SystemParameters.WorkArea.Height;
public Thickness OuterGridMargin { get; }
MainViewModel()
{
OuterGridMargin = new Thickness(w/5,h/6,w/5,h/4);
}
xaml:
<Grid Margin="{Binding OuterGridMargin}" />
我对一些外部容器执行此操作,以便布局不会在较低分辨率下混乱。目前我在 20" 中以 1600x900 分辨率(96 dpi)工作。我的应用程序类似于小工具,没有常规窗口。
我想知道是否有一些替代方法。
搜索 [wpf] 分辨率]1 给出了很多解决类似问题的问题,但我仍然陷入困境,无法得出结论实现良好的与分辨率无关的布局。
Is it a good practice to find the workarea measurement and set some properties in code so that it could be bound to Control's margin or height/Width properties in xaml?
I do this so that my window would resize according to the available workarea.
const int w = SystemParameters.WorkArea.Width;
const int h = SystemParameters.WorkArea.Height;
public Thickness OuterGridMargin { get; }
MainViewModel()
{
OuterGridMargin = new Thickness(w/5,h/6,w/5,h/4);
}
xaml:
<Grid Margin="{Binding OuterGridMargin}" />
I do this for some outer containers so that the layout would not be messed in lower resolutions. Currently I work at 1600x900 res(96 dpi) in a 20". My application is gadget like and does not have the regular window.
I want to know if there are some alternative approaches.
A search of [wpf] resolution]1 gives a lot of questions addressing similar problem but still I'm stuck and not able to come to a conclusion how to achieve a good resolution-independent layout.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
WPF 中有两种处理分辨率的方法。
一种选择是设计为最小分辨率,并确保所有内容都适当停靠,以便元素随着窗口分辨率变大而变大。这就是很多人在 WinForms 中所做的事情,并且在 WPF 中仍然可以很好地工作。您可能已经对如何通过设置 HorizontalAlignment、VerticalAlignment 和边距来处理此问题有了一些概念。
在 WPF 中要做的更新、更时尚的事情在 WinForms 中几乎不可能做到,那就是让您的应用程序实际上只是放大,这样您的控件就会像窗口一样变大。为此,您将在窗口中的某些根元素上应用 ScaleTransform,并让 WPF 处理其余的事情。真的很酷。
为了展示它的样子,以下是启动应用程序时窗口的外观,将其变小,然后将其变大: https://i.sstatic.net/QeoVK.png
这是我制作的小型示例应用程序的隐藏代码:
以及 XAML:
There are two ways to deal with resolution in WPF.
One option is to design to a minimum resolution and just make sure everything is docked appropriately so that the elements get larger as the Window resolution gets larger. This is how many people did things in WinForms and still works decently well for WPF. You probably already have some concept of how to deal with this by setting HorizontalAlignment, VerticalAlignment, and margins.
The newer, trendier thing to do in WPF that was nearly impossible to do in WinForms is have your application actually just zoom in so your controls get bigger as your Window does. To do this, you'll apply a ScaleTransform on some root element in your Window and let WPF take care of the rest. It's really cool.
To show what this is like, here's what a window would look like when you start the app, make it smaller, and make it bigger: https://i.sstatic.net/QeoVK.png
Here's the code-behind for the small sample app I made:
And the XAML:
JacobJ 的回答很好,我尝试了一下,效果非常好。
对于任何感兴趣的人,我做了一个附加行为,它做了同样的事情。我还添加了从 XAML 指定宽度/高度分母的选项。可以这样使用
ScaleToWindowSizeBehavior
Great answer by JacobJ, I tried it out and it worked perfectly.
For anyone who's interested I made an attached behavior which does the same thing. I also added the option to specify the width/height denominators from XAML. It can be used like this
ScaleToWindowSizeBehavior
对 Fredrik Hedblad 的答案进行小修正:
因为您已在 Grid 元素中设置 DependencyProperty“分母”:
您必须使用网格调用 GetDominator 方法。
而不是:
你必须使用这样的东西:
Small correction to the answer of Fredrik Hedblad:
because you have set the DependencyProperty "Denominators" in the Grid element:
you must call the GetDominator method using the grid.
Instead of:
you must use something like this:
按照 JacobJ 先生的做法,我制作了自己的衍生作品。
我创建了一个接口,我们在此基础上进行了更改
,对于这个接口,我
现在有了扩展,我们只需要添加主窗口中缺少的参数,并在主网格中的事件 sizeChanged 中设置 this.UpdateScale()
going with what mr JacobJ did I made my own spinoff.
I made a Interface on wich we base change
and for this Interface i have extension
now we only need add Parameters that we lack in main window and set this.UpdateScale() in event sizeChanged in main grid