下面通过图文并茂的方式给大家介绍wpf实现类似360安全卫士界面的程序源码分享, 点击此处下载源码 哦。
以前学习windows form编程的时候,总感觉自己做的界面很丑,看到360安全卫士、迅雷等软件的ui设计都非常美观,心里总是憧憬着要是自己能实现这样的ui效果该多好!!!另一个困扰我的问题是,这个ui皮肤是如何用技术实现的呢?!虽然好多年过去了,但心里的憧憬和疑惑一直没有消失,而且越来越强烈。在日常的工作和学习中,自己在网上也经常留意类似的技术或者文章。最近在学习wpf的过程中,看到网上也有仿360和仿迅雷ui设计的资源,通过对资源的学习和自己的动手实践,终于实现了下面的仿360安全卫士界面:
由于项目文件比较多,这里罗列出核心的过程和代码:
1、vs解决方案结构:
wpfpagetransitions是一个wpf类库,实现ui页面切换动画效果,支持多种动画,可以通过transitiontype属性进行设置,其原理是定义了多个切换动画类型的storyboard,程序根据配置的transitiontype去执行匹配的storyboard动画(分出入动画,xxxxxxin和xxxxxxout)。360ui是一个wpf 桌面应用程序,styles文件夹下存放了定义的按钮样式、菜单项样式、页签样式等样式和需要的所有ui切图资源。pages文件夹下存放切换的详细子页面。
(备注:图片资源和部分文件来自互联网,特别感谢kxfang360项目提供的360整套配图和布局文件)
2、页面切换控件核心代码:
<usercontrol x: class = "wpfpagetransitions.pagetransition"
xmlns= "http://schemas.microsoft.com/winfx//xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx//xaml"
xmlns:mc= "http://schemas.openxmlformats.org/markup-compatibility/"
xmlns:d= "http://schemas.microsoft.com/expression/blend/"
xmlns:local= "clr-namespace:wpfpagetransitions"
mc:ignorable= "d"
d:designheight= "" d:designwidth= "" >
<usercontrol.resources>
<style targettype= "{x:type contentpresenter}" >
<setter property= "layouttransform" >
<setter.value>
<scaletransform />
</setter.value>
</setter>
</style>
<local:centerconverter x:key= "centerconverter" />
<!-- slide and fade -->
<storyboard x:key= "slideandfadein" >
<thicknessanimation duration= "::." storyboard.targetproperty= "margin" from= ",,-," to= "" decelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" from= "" to= "" />
</storyboard>
<storyboard x:key= "slideandfadeout" >
<thicknessanimation duration= "::." storyboard.targetproperty= "margin" to= "-,,," accelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" to= "" />
</storyboard>
<!-- fade -->
<storyboard x:key= "fadein" >
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" from= "" to= "" />
</storyboard>
<storyboard x:key= "fadeout" >
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" to= "" />
</storyboard>
<!-- slide -->
<storyboard x:key= "slidein" >
<thicknessanimation duration= "::." storyboard.targetproperty= "margin" from= ",,-," to= "" decelerationratio= "." />
</storyboard>
<storyboard x:key= "slideout" >
<thicknessanimation duration= "::." storyboard.targetproperty= "margin" to= "-,,," accelerationratio= "." />
</storyboard>
<!-- grow -->
<storyboard x:key= "growin" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" from= "" to= "" duration= "::." decelerationratio= "." />
</storyboard>
<storyboard x:key= "growout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" to= "" duration= "::." accelerationratio= "." />
</storyboard>
<!-- grow and fade -->
<storyboard x:key= "growandfadein" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" from= "" to= "" />
</storyboard>
<storyboard x:key= "growandfadeout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" to= "" />
</storyboard>
<!-- flip -->
<storyboard x:key= "flipin" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.anglex)" from= "-" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.angley)" from= "-" to= "" duration= "::." decelerationratio= "." />
</storyboard>
<storyboard x:key= "flipout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.anglex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.angley)" to= "" duration= "::." accelerationratio= "." />
</storyboard>
<!-- flip and fade -->
<storyboard x:key= "flipandfadein" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.anglex)" from= "-" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.angley)" from= "-" to= "" duration= "::." decelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" from= "" to= "" />
</storyboard>
<storyboard x:key= "flipandfadeout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.anglex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(skewtransform.angley)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" to= "" />
</storyboard>
<!-- spin -->
<storyboard x:key= "spinin" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(rotatetransform.angle)" from= "-" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" from= "" to= "" duration= "::." decelerationratio= "." />
</storyboard>
<storyboard x:key= "spinout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(rotatetransform.angle)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" to= "" duration= "::." accelerationratio= "." />
</storyboard>
<!-- spin and fade -->
<storyboard x:key= "spinandfadein" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(rotatetransform.angle)" from= "-" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" from= "" to= "" duration= "::." decelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" from= "" to= "" />
</storyboard>
<storyboard x:key= "spinandfadeout" >
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(rotatetransform.angle)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scalex)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation storyboard.targetproperty= "(rendertransform).(transformgroup.children)[].(scaletransform.scaley)" to= "" duration= "::." accelerationratio= "." />
<doubleanimation duration= "::." storyboard.targetproperty= "opacity" to= "" />
</storyboard>
</usercontrol.resources>
<grid name= "page" >
<contentcontrol name= "contentpresenter" >
<contentcontrol.rendertransform>
<transformgroup>
<scaletransform scalex= "" scaley= ""
centerx= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualwidth, converter={staticresource centerconverter}}"
centery= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualheight, converter={staticresource centerconverter}}" />
<skewtransform anglex= "" angley= ""
centerx= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualwidth, converter={staticresource centerconverter}}"
centery= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualheight, converter={staticresource centerconverter}}" />
<rotatetransform angle= ""
centerx= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualwidth, converter={staticresource centerconverter}}"
centery= "{binding relativesource={relativesource ancestortype=grid, mode=findancestor}, path=actualheight, converter={staticresource centerconverter}}" />
<translatetransform x= "" y= "" />
</transformgroup>
</contentcontrol.rendertransform>
</contentcontrol>
</grid>
</usercontrol>
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.windows;
using system.windows.controls;
using system.windows.data;
using system.windows.documents;
using system.windows.input;
using system.windows.media;
using system.windows.media.imaging;
using system.windows.navigation;
using system.windows.shapes;
using system.threading.tasks;
using system.windows.media.animation;
namespace wpfpagetransitions
{
public partial class pagetransition : usercontrol
{
stack<usercontrol> pages = new stack<usercontrol>();
public usercontrol currentpage { get ; set ; }
public static readonly dependencyproperty transitiontypeproperty = dependencyproperty.register( "transitiontype" ,
typeof (pagetransitiontype),
typeof (pagetransition), new propertymetadata(pagetransitiontype.slideandfade));
public pagetransitiontype transitiontype
{
get
{
return (pagetransitiontype)getvalue(transitiontypeproperty);
}
set
{
setvalue(transitiontypeproperty, value);
}
}
public pagetransition()
{
initializecomponent();
}
public void showpage(usercontrol newpage)
{
pages.push(newpage);
task.factory.startnew(() => shownewpage());
}
void shownewpage()
{
dispatcher.invoke((action) delegate
{
if (contentpresenter.content != null )
{
usercontrol oldpage = contentpresenter.content as usercontrol;
if (oldpage != null )
{
oldpage.loaded -= newpage_loaded;
unloadpage(oldpage);
}
}
else
{
shownextpage();
}
});
}
void shownextpage()
{
usercontrol newpage = pages.pop();
newpage.loaded += newpage_loaded;
contentpresenter.content = newpage;
}
void unloadpage(usercontrol page)
{
storyboard hidepage = (resources[ string .format( "{}out" , transitiontype.tostring())] as storyboard).clone();
hidepage.completed += hidepage_completed;
hidepage.begin(contentpresenter);
}
void newpage_loaded( object sender, routedeventargs e)
{
storyboard shownewpage = resources[ string .format( "{}in" , transitiontype.tostring())] as storyboard;
shownewpage.begin(contentpresenter);
currentpage = sender as usercontrol;
}
void hidepage_completed( object sender, eventargs e)
{
contentpresenter.content = null ;
shownextpage();
}
}
}
3、like360main核心代码为:
其中allowstransparency="true" windowstyle="none" background="{x:null}"的目的是让wpf窗体隐藏默认的边框,这样可以允许用背景图片填充wpf定义窗体外观。在这区间可以自定义关闭、最小化和最大化按钮等。
mouseleftbuttondown="window_mouseleftbuttondown" 目的是为了支持窗体拖动。fontfamily="simsun" textoptions.textformattingmode="display"的目的是为了解决wpf中文字体显示模糊的问题。
<window x: class = "_ui.likemain"
xmlns= "http://schemas.microsoft.com/winfx//xaml/presentation"
xmlns:x= "http://schemas.microsoft.com/winfx//xaml"
title= "likemain" height= "" width= ""
fontfamily= "simsun"
allowstransparency= "true" windowstyle= "none"
xmlns:pagetransitions= "clr-namespace:wpfpagetransitions;assembly=wpfpagetransitions"
background= "{x:null}" mouseleftbuttondown= "window_mouseleftbuttondown" textoptions.textformattingmode= "display" >
<window.resources>
<lineargradientbrush x:key= "mybrush" endpoint= ".," startpoint= ".," >
<gradientstop color= "#cfffffff" />
<gradientstop color= "#ffebdd" offset= "" />
</lineargradientbrush>
</window.resources>
<border borderbrush= "black" borderthickness= "" cornerradius= "" margin= "" >
<border.effect>
<dropshadoweffect shadowdepth= "" opacity= "." />
</border.effect>
<border.background>
<imagebrush imagesource= "styles/skin/frame.jpg" />
</border.background>
<grid>
<grid.rowdefinitions>
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition/>
<rowdefinition height= "." />
</grid.rowdefinitions>
<!--上标题栏-->
<label content= "安全卫士界面" horizontalalignment= "left" width= "." foreground= "#aeff" fontweight= "bold" textoptions.textformattingmode= "display" />
<rectangle margin= "" stroke= "black" horizontalalignment= "right" width= "." grid.row= "" strokethickness= "" >
<rectangle.fill>
<imagebrush imagesource= "styles/skin/logo.png" stretch= "uniform" />
</rectangle.fill>
</rectangle>
<button content= "x" horizontalalignment= "right" margin= ",,.," style= "{dynamicresource sysbuttonstyle}" width= "." name= "closebutton" click= "closebutton_click" />
<button content= "max" horizontalalignment= "right" margin= ",,.," style= "{dynamicresource maxbuttonstyle}" width= "." name= "maxbutton" click= "maxbutton_click" >
<button.background>
<imagebrush imagesource= "styles/skin/button/max.png" stretch= "uniform" />
</button.background>
</button>
<button content= "mni" horizontalalignment= "right" margin= ",,.," style= "{dynamicresource maxbuttonstyle}" width= "." name= "mnibutton" click= "mnibutton_click" >
<button.background>
<imagebrush imagesource= "styles/skin/button/mni.png" stretch= "uniform" />
</button.background>
</button>
<button x:name= "menubutton" horizontalalignment= "right" margin= ",,.," style= "{dynamicresource mbuttonstyle}" width= "." click= "menubutton_click" >
<button.background>
<imagebrush imagesource= "styles/skin/button/m.png" stretch= "uniform" />
</button.background>
</button>
<popup x:name= "menu" allowstransparency= "true" margin= ",-,," placementtarget= "{binding elementname=menubutton}" staysopen= "false" popupanimation= "scroll" >
<grid height= "." width= "" margin= "" horizontalalignment= "left" >
<border borderthickness= "" cornerradius= "" background= "#ffefefef" margin= "" >
<border.effect>
<dropshadoweffect shadowdepth= "" opacity= "." />
</border.effect>
<stackpanel margin= "," >
<menuitem header= "设 置" style= "{dynamicresource menuitemstyle}" />
<menuitem header= "更 新" />
<menuitem header= "关 于" />
<menuitem header= "退 出" />
</stackpanel>
</border>
</grid>
</popup>
<rectangle stroke= "black" strokethickness= "" width= "" margin= ",,.,." horizontalalignment= "right" height= "" >
<rectangle.fill>
<lineargradientbrush endpoint= ".," startpoint= ".," >
<gradientstop color= "#" />
<gradientstop offset= "" color= "#addd" />
</lineargradientbrush>
</rectangle.fill>
</rectangle>
<rectangle stroke= "black" strokethickness= "" width= "" margin= ",,.,." horizontalalignment= "right" height= "" >
<rectangle.fill>
<lineargradientbrush endpoint= ".," startpoint= ".," >
<gradientstop color= "#" />
<gradientstop offset= "" color= "#addd" />
</lineargradientbrush>
</rectangle.fill>
</rectangle>
<rectangle stroke= "black" strokethickness= "" width= "" margin= ",,.,." horizontalalignment= "right" height= "" >
<rectangle.fill>
<lineargradientbrush endpoint= ".," startpoint= ".," >
<gradientstop color= "#" />
<gradientstop offset= "" color= "#addd" />
</lineargradientbrush>
</rectangle.fill>
</rectangle>
<rectangle height= "" margin= ",,.," stroke= "black" strokethickness= "" verticalalignment= "top" >
<rectangle.fill>
<lineargradientbrush endpoint= ".," startpoint= ".," >
<gradientstop color= "#ffffff" />
<gradientstop offset= "" color= "#addd" />
</lineargradientbrush>
</rectangle.fill>
</rectangle>
<!--上导航栏-->
<tabcontrol name= "tab" grid.rowspan= "" margin= "" style= "{dynamicresource tabcontrolstyle}" grid.row= "" background= "{x:null}" selectionchanged= "tabcontrol_selectionchanged" >
<tabitem header= "电脑体验" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" textoptions.textformattingmode= "display" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_examine.png" />
</tabitem.background>
<grid margin= "" background= "{dynamicresource mybrush}" >
<grid.columndefinitions>
<columndefinition width= ".*" />
<columndefinition width= ".*" />
<columndefinition width= ".*" />
</grid.columndefinitions>
<grid.rowdefinitions>
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
</grid.rowdefinitions>
<!--详细-->
<label content= "电脑体检" horizontalalignment= "left" margin= "" width= "." height= "" fontsize= "." fontweight= "bold" grid.column= "" grid.row= "" grid.columnspan= "" />
<pagetransitions:pagetransition name= "ptransitioncontrol_" margin= "" transitiontype= "slideandfade" grid.column= "" grid.row= "" grid.columnspan= "" grid.rowspan= "" />
</grid>
</tabitem>
<tabitem header= "查杀木马" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_dsmain.png" />
</tabitem.background>
<grid margin= "" background= "{dynamicresource mybrush}" >
<grid.columndefinitions>
<columndefinition width= ".*" />
<columndefinition width= ".*" />
<columndefinition width= ".*" />
</grid.columndefinitions>
<grid.rowdefinitions>
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
</grid.rowdefinitions>
<!--详细-->
<label content= "查杀木马" horizontalalignment= "left" margin= "" width= "." height= "" fontsize= "." fontweight= "bold" grid.column= "" grid.row= "" grid.columnspan= "" />
<pagetransitions:pagetransition name= "ptransitioncontrol_" margin= "" transitiontype= "slideandfade" grid.column= "" grid.row= "" grid.columnspan= "" grid.rowspan= "" />
</grid>
</tabitem>
<tabitem header= "清理插件" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_plugincleaner.png" />
</tabitem.background>
<grid margin= "" background= "{dynamicresource mybrush}" >
<grid.columndefinitions>
<columndefinition width= ".*" />
<columndefinition width= ".*" />
<columndefinition width= ".*" />
</grid.columndefinitions>
<grid.rowdefinitions>
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
<rowdefinition height= "." />
</grid.rowdefinitions>
<!--详细-->
<label content= "清理插件" horizontalalignment= "left" margin= "" width= "." height= "" fontsize= "." fontweight= "bold" grid.column= "" grid.row= "" grid.columnspan= "" />
<pagetransitions:pagetransition name= "ptransitioncontrol_" margin= "" transitiontype= "slideandfade" grid.column= "" grid.row= "" grid.columnspan= "" grid.rowspan= "" />
</grid>
</tabitem>
<tabitem header= "修复漏洞" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_vulrepair.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
<tabitem header= "清理垃圾" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_rubbishcleaner.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
<tabitem header= "清理痕迹" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_tracecleaner.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
<tabitem header= "系统修复" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_sysrepair.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
<tabitem header= "功能大全" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_advtools.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
<tabitem header= "软件管家" height= "" margin= ",,," width= "" style= "{dynamicresource tabitemstyle}" >
<tabitem.background>
<imagebrush imagesource= "styles/skin/ico/ico_softmgr.png" />
</tabitem.background>
<grid background= "{dynamicresource mybrush}" />
</tabitem>
</tabcontrol>
<!--导航详细-->
<!--下状态栏-->
<label content= "欢迎使用仿系统" margin= "" grid.row= "" foreground= "#aeff" fontweight= "bold" borderthickness= "" borderbrush= "white" horizontalalignment= "left" width= "." textoptions.textformattingmode= "display" />
<label content= "已连接网络" margin= "" grid.row= "" foreground= "#aeff" fontweight= "bold" borderthickness= "" borderbrush= "white" horizontalalignment= "right" width= "" textoptions.textformattingmode= "display" />
</grid>
</border>
</window>
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows;
using system.windows.controls;
using system.windows.data;
using system.windows.documents;
using system.windows.input;
using system.windows.media;
using system.windows.media.imaging;
using system.windows.shapes;
namespace _ui
{
/// <summary>
/// likemain.xaml 的交互逻辑
/// </summary>
public partial class likemain : window
{
public likemain()
{
initializecomponent();
}
private void closebutton_click( object sender, routedeventargs e)
{
this .close();
}
private void maxbutton_click( object sender, routedeventargs e)
{
if (windowstate == windowstate.normal)
windowstate = windowstate.maximized;
else
windowstate = windowstate.normal;
}
private void mnibutton_click( object sender, routedeventargs e)
{
this .windowstate = windowstate.minimized;
}
private void menubutton_click( object sender, routedeventargs e)
{
menu.isopen = true ;
}
private void window_mouseleftbuttondown( object sender, mousebuttoneventargs e)
{
//拖动
this .dragmove();
}
private void tabcontrol_selectionchanged( object sender, selectionchangedeventargs e)
{
int index = this .tab.selectedindex;
if (index == )
{
//可以设置transitiontype wpfpage 来更改界面出入的动画效果
//this.ptransitioncontrol_.transitiontype = wpfpagetransitions.pagetransitiontype.spinandfade;
pages.index newpage = new pages.index();
this .ptransitioncontrol_.showpage(newpage);
}
else if (index == )
{
pages.scan newpage = new pages.scan();
this .ptransitioncontrol_.showpage(newpage);
}
else if (index == )
{
pages.scan newpage = new pages.scan();
this .ptransitioncontrol_.showpage(newpage);
}
else
{
pages.index newpage = new pages.index();
this .ptransitioncontrol_.showpage(newpage);
}
}
}
}
当用户单击tab页签时(切换事件),程序 用pages.index newpage = new pages.index();先实例化一个page子页面(实际继承usercontrol),然后调用 this.ptransitioncontrol_1.showpage(newpage);将子页面进行加载(本质上是ptransitioncontrol_1.content=newpage)。
4、运行代码,界面如下:
下面是360安全卫士界面截图,可对比一下,还是比较相似的。
dy("nrwz");
查看更多关于WPF实现类似360安全卫士界面的程序源码分享的详细内容...