使用Blend设计出符合效果的WPF界面

之前不会用blend,感觉好难的,但美工给出的效果自己有没办法实现,所以研究了一下blend,感觉没有想象中的那么难

废话不多说,开始界面设计

今天拿到美工给的一个界面效果图

这个界面说实话,还可以吧,勉强说得过去。拿到界面效果图,难的两个部分都让我框起来的,这一看就是wpf里面的控件TabControl美化而来,其他部分都是很好弄得,这一篇我们下来美化一个tabControl控件。如下图:

这里我们借助vs 2015 自带的blend,,这个软件安装vs2015就会默认安装上。

我们来新建一个wpf项目,然后在里面修改这个控件

这是我的blend for vs2015

根据图中的标识,我们拖拽一个TabControl控件到界面上去,然后调整好大小,如下图:

接下来我们就拿它开刀吧

首先分析,明显的TabItem部分不符合我们的要求,这样我们就编辑这部分样式即可

这样我们可以看到代码会变为如下

 1 <Grid>
 2         <TabControl x:Name="tabControl" Margin="97.847,87.164,121.924,82.721">
 3             <TabItem Header="TabItem" Style="{DynamicResource TabItemStyle1}">
 4                 <Grid Background="#FFE5E5E5"/>
 5             </TabItem>
 6             <TabItem Header="TabItem" Style="{DynamicResource TabItemStyle1}">
 7                 <Grid Background="#FFE5E5E5"/>
 8             </TabItem>
 9         </TabControl>
10
11     </Grid>

后面的一个样式是我后加上去的,这样方便查看效果

我们在样式中找到key=”TabItemStyle1”,这个样式就决定了我们现在TabItem展示样式。

我们可以看到,这个样式中有个边框,我们可以在样式中找到这个边框,然后去掉它,看样是

1  <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
2                                 <ContentPresenter x:Name="Content" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
3                             </Border>

修改为

1  <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0,0,0" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
2                                 <ContentPresenter x:Name="Content" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
3                             </Border>

现在就可以看到边框消失了

下面我们将背景图改为白色,我们先来看他目前的背景颜色定义 <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>,这个就是定义了背景颜色,下面我们修改key=ButtonNormalBackground的颜色即可修改TabItem的背景颜色了。

我们可以找到现在定义为:

1 <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
2             <GradientStop Color="#F3F3F3" Offset="0"/>
3             <GradientStop Color="#EBEBEB" Offset="0.5"/>
4             <GradientStop Color="#DDDDDD" Offset="0.5"/>
5             <GradientStop Color="#CDCDCD" Offset="1"/>
6         </LinearGradientBrush>

我们把渐变去掉,只要白色即可修改为:<SolidColorBrush x:Key="ButtonNormalBackground" Color="White"/>,现在我们再来看效果

,怎么样,是不是接近了美工给的效果图呢,好吧,还是差挺多,我们继续修改

TabItem下面有个横线,而选中的下面还有个粗横线,并且被选中额TabItem文字为浅蓝色背景,接下来我们逐一进行修改。

先来添加TabItem下面的横线,我们可以看到这个横线在TabItem与下面的面板之间,所以我们不能修改TabItem来添加这条横线,所以我们来修改整个TabControl的样式,

在代码中查找新生成的TabControlStyle1样式

我们可以看到以下代码

 1 <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
 2                             <Grid.ColumnDefinitions>
 3                                 <ColumnDefinition x:Name="ColumnDefinition0"/>
 4                                 <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
 5                             </Grid.ColumnDefinitions>
 6                             <Grid.RowDefinitions>
 7                                 <RowDefinition x:Name="RowDefinition0" Height="Auto"/>
 8                                 <RowDefinition x:Name="RowDefinition1" Height="*"/>
 9                             </Grid.RowDefinitions>
10                             <TabPanel x:Name="HeaderPanel" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>
11                             <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
12                                 <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
13                             </Border>
14                         </Grid>

我们可以分析看出,控件是分了两行两列,TabItem在上面一行,Panel放在了下面一样,我们可以巧妙的加入一个Grid控件(将两行改为3行,Grid放在第二行,而原来的panel改为第三行),并设置背景颜色,及高度,然后让Grid控件位于TabItem及panel之间,代码如下

 1 <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
 2                             <Grid.ColumnDefinitions>
 3                                 <ColumnDefinition x:Name="ColumnDefinition0"/>
 4                                 <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
 5                             </Grid.ColumnDefinitions>
 6                             <Grid.RowDefinitions>
 7                                 <RowDefinition x:Name="RowDefinition0" Height="Auto"/>
 8                                 <RowDefinition x:Name="RowDefinition2" Height="Auto"/>
 9                                 <RowDefinition x:Name="RowDefinition1" Height="*"/>
10                             </Grid.RowDefinitions>
11                             <TabPanel x:Name="HeaderPanel" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>
12                             <Grid Grid.Row="1" Background="#A8D3FE" VerticalAlignment="Top" Height="2">
13
14                             </Grid>
15                             <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="2" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
16                                 <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
17                             </Border>
18                         </Grid>

现在我们再来看一下效果

是不是离成功又进了一步呢,下面我们来添加选中状态下的比较粗的下划线

这次我们又该回来修改TabItem的样式了。

在代码中找到如下:

1 <Trigger Property="IsSelected" Value="true">
2        <Setter Property="Panel.ZIndex" Value="1"/>
3        <Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemSelectedBackground}"/>
4 </Trigger>

这个样式定义了被选中是的状态,这样我们可以在TabItem中添加一个粗的下划线,平时的时候让其hidden,而选中时隐藏。同样这个下划线使用Grid控件来构造

代码修改后如下:

1 <Grid SnapsToDevicePixels="true">
2
3      <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0,0,0" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
4               <ContentPresenter x:Name="Content" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
5      </Border>
6      <Grid Height="3" x:Name="bottomLine" VerticalAlignment="Bottom" Background="#498FD7" Visibility="Hidden">
7       </Grid>
8</Grid>

注意,上面的代码只由6,7行是后添加的

下面我们来修改被选中状态的属性值

1 <Trigger Property="IsSelected" Value="true">
2      <Setter Property="Panel.ZIndex" Value="1"/>
3      <Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemSelectedBackground}"/>
4      <Setter Property="Visibility" TargetName="bottomLine" Value="Visible"/>
5</Trigger>

同样需要注意的是,只有第4行是我后添加的代码

现在我们可以来看下效果了

怎么样,已经无限接近了吧,还剩下一个被选中状态是文字的颜色,我想大家都知道怎么修改了吧。

来,这就修改一下,添加一行代码即可,

 <Setter Property="Foreground" Value="#498FD7"/>

好了,这个简单的控件样式到此就全部结束了

是不是跟美工设计的差不多呢,如果运行起来看,还有些地方需要修改,例如鼠标在头部悬浮,头部的样式就会发生变化,这样我们还需要继续修改样式。

我们可以通过删除一行代码就可以达到效果了

1 <Trigger Property="IsMouseOver" Value="true">
2                                 <!--
3                                 <Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemHotBackground}"/>
4                                 -->
5                             </Trigger>

over,有时间我还会将美工设计的另一个控件美化篇贴出来

时间: 2024-08-24 12:48:33

使用Blend设计出符合效果的WPF界面的相关文章

使用popupwindow设计出popupmenu效果的菜单

1.popupwindow的布局文件:menu_layout.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height

WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了,经过努力

3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子

原文:3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子 3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子   所用的软件 3ds Max 9.0,Microsoft Expression Blend,VS 2008 例子下载 例子:http://files.cnblogs.com/wxwinter/wxd_wpf_3d.rar 例子中的文件说明   应用场景 在以前作过的一个系统(MRP)中,需要 用工作流监视设备(工作坏境),并将设备(工作坏境)

9个步骤:教你设计出优秀的MMORPG副本关卡

转自:http://www.gameres.com/664485.html 副本的定义 以一张场景地图为原型,针对单个玩家.队伍或者团队生成的一个实例,包含完整的开启关闭.怪物刷新.进度记录等逻辑. 副本的作用 1. 更有效的给予用户成就感: a)有效的展示.验证角色及用户的能力——数值和技巧难度考验角色属性能力及用户操作技术: b)加深用户对角色职业特性的认知,有效的展现职业特性价值——战斗考虑到职业特性的发挥: c)提供给玩家提升角色能力的场所——价值物的产出控制: 2. 更有效的带给用户乐

网页设计中透明效果的使用技巧

在网页设计中使用透明效果是件既美观又冒险的事儿.透明效果的使用是把色块,文本或图像“变薄”或者降低饱和度,使颜色变浅透明,这样下个图层的内 容就能穿透显示出来.这种方法如果用好了,效果将会特别棒——能突出显示文本或者在图像的特定区域形成焦点.但设计者在运用透明效果时要特别小心,因为这 么做可能会影响页面的可读性.要是框和文本的透明度不对,更可能会影响到整体的设计. 下文是一些注意事项以及巧妙运用透明效果的成功案例. 用“透明效果”来制造对比 使 用透明效果最大的优点是可以形成对比.设计者可以在图

如何增强ArcGIS插值图出图效果

by 李远祥 在一些科研领域,经常会遇到使用插值的方式进行处理,并生成最终的插值图.插值图在ArcGIS里面非常容易生成,只要具备了采用点数据,通过ArcToolBox里面的插值的工具可以直接生成最终的插值数据.插值的方法有很多种,这里就不做介绍了.数据生成后,其地图制作也是相当的简单,只需要在符号系统的标签里面设置一下,并进行重分类,使用色带去渲染就可以完成.下图去掉一些地图的整饰元素,直接使用最原始的栅格渲染方式进行出图. 尽管这个图按照笔者的经验,将研究区域的边界加上去,并且标红,加入一些

使用JavaScript实现弹出层效果

声明 阅读本文需要有一定的HTML.CSS和JavaScript基础 设计 实现弹出层效果的思路非常简单:将待显示的内容先隐藏,在触发某种条件后(如点击按钮),将原本隐藏的内容显示出来. 实现 <!DOCTYPE html> <html> <head> <title>Window对象</title> <meta charset="utf-8"> </head> <body> <a hr

Axure 动态面板实现弹出框效果

今天在画原型图的时候遇到了个弹出框效果的实现,感觉挺有意思的,拿出来share下~ 如图:当我点击删除按钮后,如果用户选择删除,则要求要弹出一个对话框来让用户输入处理备注,如果不要删除,则点击取消: 首先描述下大致思路,我在页面上加上一个动态面板,然后为这个动态面板加上两个状态,一个是显示弹出框,另一个是隐藏弹窗口. 下面是弹出对话框的两个状态的设计: 隐藏状态的动态面板设置为空白,这样当切换到这个状态时就看不到任何东西. 然后为删除按钮添加用例: 注意,这里是当发生单击事件的时候弹出动态面板,

如何设计出高可用的分布式架构

在分布式架构中,SOA 和微服务架构是最常见的两种分布式架构,而且目前服务网格的概念也越来越火了,我们就先从这些常见的架构开始. SOA 架构解析 SOA 全称是:Service Oriented Architecture,中文释义为 "面向服务的架构". 它是一种设计理念,其中包含多个服务,服务之间通过相互依赖最终提供一系列完整的功能. 各个服务通常以独立的形式部署运行,服务之间通过网络进行调用,架构图如下: 跟 SOA 相提并论的还有一个 ESB(企业服务总线),简单来说 ESB