WPF 中,动态创建Button,并使Button得样式按照自定义的Resource样式显示
第一步:自定义一个Button的样式
1.新建一个xaml文件,在其中自定义好自己的Resources
这个Resource 的根节点是
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"></ResourceDictionary>
2.然后在根节点中写入自己要定义的样式,
注意,在对应特定控件的样式中,要写入 TargetType 对应于要设置样式的控件,如:
TargetType="{x:Type Button}",并且对样式写上x:key= 以便查找:
入下面一个例子:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="GlassYButton" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="FontSize" Value="15" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<!-- Background Layer -->
<Ellipse Fill="{TemplateBinding Background}"/>
<!-- Refraction Layer -->
<Ellipse x:Name="RefractionLayer">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.4" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<!-- Reflection Layer -->
<Path x:Name="ReflectionLayer" VerticalAlignment="Top" Stretch="Fill">
<Path.RenderTransform>
<ScaleTransform ScaleY="0.5" />
</Path.RenderTransform>
<Path.Data>
<PathGeometry>
<PathFigure IsClosed="True" StartPoint="98.999,45.499">
<BezierSegment Point1="98.999,54.170" Point2="89.046,52.258" Point3="85.502,51.029"/>
<BezierSegment
IsSmoothJoin="True"
Point1="75.860,47.685"
Point2="69.111,45.196"
Point3="50.167,45.196"/>
<BezierSegment Point1="30.805,45.196" Point2="20.173,47.741" Point3="10.665,51.363"/>
<BezierSegment
IsSmoothJoin="True"
Point1="7.469,52.580"
Point2="1.000,53.252"
Point3="1.000,44.999"/>
<BezierSegment Point1="1.000,39.510" Point2="0.884,39.227" Point3="2.519,34.286"/>
<BezierSegment
IsSmoothJoin="True"
Point1="9.106,14.370"
Point2="27.875,0"
Point3="50,0"/>
<BezierSegment Point1="72.198,0" Point2="91.018,14.466" Point3="97.546,34.485"/>
<BezierSegment
IsSmoothJoin="True"
Point1="99.139,39.369"
Point2="98.999,40.084"
Point3="98.999,45.499"/>
</PathFigure>
</PathGeometry>
</Path.Data>
<Path.Fill>
<RadialGradientBrush GradientOrigin="0.498,0.526">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform
CenterX="0.5"
CenterY="0.5"
ScaleX="1"
ScaleY="1.997"/>
<TranslateTransform X="0" Y="0.5"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#FFFFFFFF"/>
<GradientStop Offset="0.85" Color="#92FFFFFF"/>
<GradientStop Offset="0" Color="#00000000"/>
</RadialGradientBrush>
</Path.Fill>
</Path>
<!-- ContentPresenter -->
<ContentPresenter Margin="0,2,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="RefractionLayer" Property="Fill">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform
CenterX="0.5"
CenterY="0.5"
ScaleX="1.5"
ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.45" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter TargetName="ReflectionLayer" Property="Fill">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.498,0.526">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform
CenterX="0.5"
CenterY="0.5"
ScaleX="1"
ScaleY="1.997"/>
<TranslateTransform X="0" Y="0.5"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#FFFFFFFF"/>
<GradientStop Offset="0.85" Color="#BBFFFFFF"/>
<GradientStop Offset="0" Color="#00000000"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="RefractionLayer" Property="Fill">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform
CenterX="0.5"
CenterY="0.5"
ScaleX="1.5"
ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.3" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter TargetName="ReflectionLayer" Property="Fill">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.498,0.526">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform
CenterX="0.5"
CenterY="0.5"
ScaleX="1"
ScaleY="1.997"/>
<TranslateTransform X="0" Y="0.5"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#CCFFFFFF"/>
<GradientStop Offset="0.85" Color="#66FFFFFF"/>
<GradientStop Offset="0" Color="#00000000"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
2.
第二步:在项目的配置文件 App.xaml 中配置 自定义Resources
在 App.xml根节点下面建立一个 <Application.Resources>,其中定义ResourceDictionary节点
在其中配置自己定义的Resources,例如:
<Application x:Class="PaperOfficerPro.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resource/ButtonResource.xaml"></ResourceDictionary>
<ResourceDictionary Source="Resource/ExpanderStyleResource.xaml"></ResourceDictionary>
<ResourceDictionary Source="Resource/GlassButtonStyle.xaml"></ResourceDictionary>
<ResourceDictionary Source="Resource/DataGridResource.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
第三步:在页面的后台写程序动态生成Button,
这里的实例是,检索数据库,根据检索的数据动态生成一个按钮,按钮的个数是检索出来的数据的条数
例如:
private void initCourseButton()
{
PaperDBHelper.ConnectDB();
String sql = "select keyID ,courseID,courseName from course order by keyID ";
DataSet courseDS = PaperDBHelper.GetDataSet(CommandType.Text, sql, null);
DataTable dt = courseDS.Tables[0];
for (int i = 0; i < dt.Rows.Count; i++) //for循环检索出来的数据,生成Button
{
Button button = new Button();
button.Content = dt.Rows[i]["courseName"]; //Button按钮上的显示内容为数据库中的一个字段值
button.Width = 80;
button.Height = 50;
button.Margin = new Thickness(0 + i * 80, 507, 560 - i * 120, 4);//动态生成Button的位置
button.Name = "button" + (i + 1);//动态生成Button的Name
button.SetResourceReference(StyleProperty, "GlassYButton");//将自定义的样式赋值给Button
//的相应属性,第一个参数是第一步中的Resource是定义的Button的Style,因此第一个参数为StyleProperty
//意思是赋值给style这个属性,第二个参数是样式中的x:key的值
button.Click += new RoutedEventHandler(btnEvent_Click);//为动态生成的Button添加事件
this.ButtonGrid.Children.Add(button);//注意,最后要将自定义的Button控件加入到页面中包含它
//的容器中
this.ButtonGrid.RegisterName("button" + (i + 1), button);//注册button的名称
}
}
WPF 中,动态创建Button,并使Button得样式按照自定义的Resource样式显示的更多相关文章
- WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName(" ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- WPF中动态更新TextBlock文字中的超链接,文本
1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBloc ...
- Delphi中动态创建窗体有四种方式
Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...
- jQuery中动态创建、添加元素的方法总结
<input type="button" value="创建元素" id="btn"> <div id="box ...
- BroadcastReceiver接收电量变化的广播-------在代码中动态创建接受者
本例为动态创建广播接收者即不是在AndroidManifest.xml文件中定义的广播接收着 代码: package com.qf.broadcastreceiver01; import androi ...
- Unity中动态创建Mesh
什么是Mesh? Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的.即一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和 ...
- python中动态创建类
class Foo(Bar): pass Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧 ...
随机推荐
- ulua学习笔记(二):官方资料及问题解决方案
uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...
- SQL Server内存性能分析
内存概念: Working Set = Private Bytes + Shared Memory Working Set:某个进程的地址空间中,存放在物理内存的那一部分 Private Bytes: ...
- 2015北京网络赛 G题 Boxes bfs
Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...
- NYOJ109 数列转换 【守恒法】
数列转换 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 有一个数列a1,a2,a3...an,每次能够从中随意选三个相邻的数ai-1 ,ai , ai+1 ,进行例 ...
- node.js在windows下的学习笔记(7)---express的app.js的详细配置说明
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon') ...
- POJ 3104 Drying 二分
http://poj.org/problem?id=3104 题目大意: 有n件衣服,每件有ai的水,自然风干每分钟少1,而烘干每分钟少k.求所有弄干的最短时间. 思路: 注意烘干时候没有自然风干. ...
- zend studio 安装xdebug
XDebug安装 到http://xdebug.org/download.php选择自己需要的xdebug版本.然后按照下面的配置建立目录.并在php.ini加入这些内容.重启server 注意xde ...
- VC 部署
部署是分发要安装到其他计算机上的已完成应用程序或组件的过程. 当使用 Visual C++ 库提供的功能生成 C/C++ 应用程序时,该应用程序在运行时将依赖于那些库的存在. 为了让应用程序运行,它必 ...
- 乐视mysql面试题
http://blog.itpub.net/28916011/viewspace-2093197/ 最近,朋友去乐视面试了mysql DBA,以下是我据整理的乐视mysql面试题答案,供大家参考 ...
- Models and the ServiceManager
Models and the ServiceManager In the previous chapter we've learned how to create a "Hello Worl ...