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自适应窗体实现小结的更多相关文章

  1. [小结][N种方法]实现WPF不规则窗体

    原文:[小结][N种方法]实现WPF不规则窗体 WPF实现不规则窗体,方法很多很多多.... 本文总结DebugLZQ认为简洁高效的几种方法 实现WPF不规则窗体的几种常用的方法如下: 1.使用Ble ...

  2. C# WPF DataGrid在Grid中自适应窗体大小

    XAML 中设置   例如 <DataGrid AutoGenerateColumns="False" Margin="6" Name="dgV ...

  3. WPF中窗体最大化问题处理

    遇到的问题信息 问题:当WindowStyle=None时,窗口最大化,不显示任务栏 -- 即窗体是全屏效果. 解决中遇到的问题列表[主要涉及到任务栏发生改变后的一些问题处理]: 最大化时,任务栏被遮 ...

  4. WPF实现窗体中的悬浮按钮

    WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘. 控件XAML代码: <Button x:Class="SunCreate.Common.Controls.FloatBut ...

  5. WPF透明窗体制作

    原文:WPF透明窗体制作 窗体的样式: <Grid Width="{Binding Width, ElementName=w}" Height="{Binding ...

  6. .NET CORE(C#) WPF亚克力窗体

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF亚克力窗体 阅读导航 本文背景 代码实现 本文参考 源码 1 ...

  7. WPF子窗体

    效果: 1. 点击WPF主窗体上的一个按钮,弹出子窗体, 2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体. 1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体Ch ...

  8. WPF 子窗体关闭时显示父窗体

    这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...

  9. c#自适应窗体的实现

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

随机推荐

  1. 【HEVC】4、HM-16.7编码一个CU(帧内部分) 3.帧内预测各种模式实现

    HEVC中一共定义了35中帧内编码预测模式,编号分别以0-34定义.其中模式0定义为平面模式(INTRA_PLANAR),模式1定义为均值模式(INTRA_DC),模式2~34定义为角度预测模式(IN ...

  2. 从一个int值显示相应枚举类型的名称或者描述

    我正在做一个出入库管理的简单项目,在Models里定义了这样的枚举类型 public enum InOrOut { [Description("出库")] Out = , [Des ...

  3. C++注意

    断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况. 在函数的入口处,使用断言检查参数的有效性(合法性). 如果程序在assert处终止了,并不是说含有该assert的函数 ...

  4. dede无子栏目的栏目直接调用顶级栏目(不让调用的解决方法) noself=\'yes\'

    大家在用dede做网站的时候经常会出现一个问题就是当调用子栏目的时候会出现无子栏目的栏目直接调用顶级栏目,   解决dede无子栏目时出现同级栏目的问题   {dede:channel type='s ...

  5. IT行业找工作难

    1.面试官主要看年龄,年龄小,技术再牛也不给你面试机会. 2.现在培训机构太多了,不管多大岁数的人看见这行业赚钱就立刻辞职去培训. 3.刚培训出来的能找到2w!!有的老板面试只看工作经验,不管之前干什 ...

  6. PHP常用函数大全

    usleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_until() ...

  7. nodeJS环境

    nodeJS官网:https://nodejs.org/en/,  npm官网(node package manager):https://www.npmjs.com/ 进入nodejs官方网站下载软 ...

  8. java类型占用字节数&类型转换

    1.整型类型              存储需求     bit数    取值范围      备注int                 4字节           4*8 short         ...

  9. innodb buffer pool小解

    INNODB维护了一个缓存数据和索引信息到内存的存储区叫做buffer pool,他会将最近访问的数据缓存到缓冲区.通过配置各个buffer pool的参数,我们可以显著提高MySQL的性能. INN ...

  10. HDOJ(1348)二维凸包

    Wall http://acm.hdu.edu.cn/showproblem.php?pid=1348 题目描述:有个国王想在他的城堡外面修围墙,围墙与城堡的最小距离为L,要求围墙长度最短.求围墙的长 ...