WPF自适应窗体实现小结
WPF自适应窗体实现小结
这几天,因工作需要,要对一个小软件进行UI调整。主要内容就是让其能够实现自适应窗体(包括文字和图标),做成像WIN7下的Media Center一样的UI。自适应窗体,顾名思义,就是窗口内容的显示大小能够随着窗口的大小变化而变化。今天我来说说如何用WPF来实现自适应窗体。
首先WPF是微软推出的新一代视窗系统,用来代替MFC。用MFC来实现自适应窗体,需要捕获Resizing事件,然后对窗口内容大小进行逐一调整,还是比较麻烦的。但是WPF不同,因为WPF自带的Layout(WPF布局系统)就支持自适应窗体。
WPF要实现自适应窗体主要靠Grid和DockPanel这2个控件。这2个控件简单来说就是容器,用来承载其它控件。不同的是Grid是定义由行和列组成的灵活网格区域,而DockPanel是定义可水平或垂直排列子元素的区域。
下面我来举个例子说明如何用Grid或DockPanel来实现自适应窗体。
让我们新建一个WPF工程,完成后我们打开对应的XAML文件,可以看到VS已经自动添加了<Grid></Grid>这一对标签,下面我就以Grid为例展示如何实现窗体自适应(如果需要使用DockPanel只需把<Grid></Grid>换成<DockPanel></DockPanel>即可)。
<Window x:Class="Auto_Match_Window.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
下面往Grid里面添加2个控件TextBlock和Button,如下:
<Window x:Class="Auto_Match_Window.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBlock Text="Hello World!" Margin="100,100,100,100"/>
<Button Content="Button" Margin="100,120,100,100"/>
</Grid>
</Window>
注意:这里不能给TextBlock和Button定义高度和宽度,因为这样会把控件的高度和宽度定死,结果就是不能随着窗口大小的变化而变化。那要怎么调整控件的初始大小呢?用Margain!!Margain不是只能调整位置,它也可以调整控件大小哦。
让我们来看看效果怎样:
通过上面2张图,我们可以看到控件确实随着窗口大小的变化而变化,但是我们又发现无论是TextBlock还是Button的文字并没有随着窗口变化,这是为什么呢?那是因为Grid和DockPanel不支持文本的自动变化。
那文本是不是就没办法自动变化了呢?放心WPF提供另外一个控件Viewbox,用于支持文本变化。让我们修改一下刚才的代码,如下:
<Window x:Class="Auto_Match_Window.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Viewbox VerticalAlignment="Top">
<TextBlock Text="Hello World!" VerticalAlignment="Top"/>
</Viewbox>
<Viewbox VerticalAlignment="Bottom">
<Button Content="Button"/>
</Viewbox>
</Grid>
</Window>
效果如下:
如果加了Viewbox,画面的布局可能比较难以调整,这个时候就需要用到Width和Height这2个属性了。读者可能有疑问了,为什么不加Viewbox只用Grid或DockPanel不能指定Width和Height,而Viewbox就可以。那是因为Viewbox其实是靠stretch这个属性实现文本的自动变化,这也意味着Viewbox是通过拉伸或平铺来达到缩放文本的效果,就好比位图。而Grid和DockPanel就好比矢量图。
代码如下:
<Window x:Class="Auto_Match_Window.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Viewbox>
<TextBlock Text="Hello World!" Margin="100,100,100,100"/>
</Viewbox>
<Viewbox>
<Button Content="Button" Margin="100,120,100,100" Height="92" Width="118"/>
</Viewbox>
</Grid>
</Window>
效果:
好了,让我们来总结一下:
1、 WPF采用Grid和DockPanel来实现窗体自适应,通过控件的Margain属性来调整控件的起始位置和大小,不能使用Height和Width属性;
2、 如果要实现文本自动变化,采用Viewbox控件,可以使用Height和Width来调整控件大小;
3、 想偷懒的话,可以把MainWindow的最外面一层Grid放入Viewbox中,这样只需稍微调整一下某些控件的布局即可达到整个窗体的自适应效果。
这是我第一次写博客,写的不好,请大家体谅。
WPF自适应窗体实现小结的更多相关文章
- [小结][N种方法]实现WPF不规则窗体
原文:[小结][N种方法]实现WPF不规则窗体 WPF实现不规则窗体,方法很多很多多.... 本文总结DebugLZQ认为简洁高效的几种方法 实现WPF不规则窗体的几种常用的方法如下: 1.使用Ble ...
- C# WPF DataGrid在Grid中自适应窗体大小
XAML 中设置 例如 <DataGrid AutoGenerateColumns="False" Margin="6" Name="dgV ...
- WPF中窗体最大化问题处理
遇到的问题信息 问题:当WindowStyle=None时,窗口最大化,不显示任务栏 -- 即窗体是全屏效果. 解决中遇到的问题列表[主要涉及到任务栏发生改变后的一些问题处理]: 最大化时,任务栏被遮 ...
- WPF实现窗体中的悬浮按钮
WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘. 控件XAML代码: <Button x:Class="SunCreate.Common.Controls.FloatBut ...
- WPF透明窗体制作
原文:WPF透明窗体制作 窗体的样式: <Grid Width="{Binding Width, ElementName=w}" Height="{Binding ...
- .NET CORE(C#) WPF亚克力窗体
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF亚克力窗体 阅读导航 本文背景 代码实现 本文参考 源码 1 ...
- WPF子窗体
效果: 1. 点击WPF主窗体上的一个按钮,弹出子窗体, 2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体. 1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体Ch ...
- WPF 子窗体关闭时显示父窗体
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
- c#自适应窗体的实现
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
随机推荐
- windows 下编译log4cxx(x64)
参考链接 http://blog.csdn.net/hnu_zxc/article/details/7786060 http://blog.chinaunix.net/uid-20384806-id- ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
- 关于PetaPoco的T4模板使用
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM.PetaPoco介绍:http://www.cnblogs.com/youring2/archive/2012/06/ ...
- [DFNews] Fire-Eye与Fox IT联合推出Cryptolocker解锁网站
Cryptolocker是臭名昭著的勒索程序,使用AES加密后密钥回传,用户除了缴纳赎金之外基本无法解密数据. 近日,知名安全公司Fire-Eye与Fox IT联合推出了针对该勒索程序的解锁网站 ht ...
- CuteSTL——跟着感觉造轮子
置顶推荐: CuteSTL:https://github.com/jxd134/algorithm/tree/master/CuteSTL TinySTL:https://github.com/zou ...
- Mysql使用workbench迁移数据
原文:http://jingyan.baidu.com/article/925f8cb8f3ec25c0dce05644.html 打开Mysql WorkBench,连接到数据库: 首先选中:Man ...
- [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> ...
- 好用的一个从SharePoint导出小工具
1. 输入 Site Url(Site Collection), 然后点"load"按钮 2.选择Web后,点选需导出的文档库,然后点"Next"按钮 ...
- SQLSERVER如何查看索引缺失
SQLSERVER如何查看索引缺失 当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事 ...
- Java应用程序访问网络资源--HttpClient
HttpClient的最本质的功能是执行HTTP方法.一个HTTP方法的执行涉及到一个或几个HTTP请求/ HTTP响应的交流,通常由HttpClient的内部处理.用户预计将提供一个请求对象来执行和 ...