WPF 自定义属性
做了一个自定义控件和一个自定义Grid,里面的元素可以随着绑定属性变化:
效果图(一定滑块):

关键代码:
1、自定义属性代码:
public class MyGrid : Grid
{
public static readonly DependencyProperty ColumnCountProperty = DependencyProperty.Register("ColumnCount", typeof(int), typeof(MyGrid),
new FrameworkPropertyMetadata((int),FrameworkPropertyMetadataOptions.AffectsRender,null,new CoerceValueCallback(CoerceColumnCount)));
public int ColumnCount
{
get { return (int)GetValue(ColumnCountProperty); }
set { SetValue(ColumnCountProperty, value); }
}
private static object CoerceColumnCount(DependencyObject element, object value)
{
int input = (int)value; if (input < )
{
return ;
}
else
{
return input;
}
} protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
base.OnRender(dc); //获得现有行数、列数
int columnCount = this.ColumnDefinitions.Count;
int rowCount = this.RowDefinitions.Count;
//不变化,则不处理
if (this.ColumnDefinitions.Count == this.ColumnCount) return;
//获得最后一个元素的数量
int elementCount = ;
for (int i = this.Children.Count - ; i >= ; i--)
{
UIElement element = this.Children[i];
int row = Grid.GetRow(element);
int column = Grid.GetColumn(element);
int num = row * columnCount + column + ;
if (num > elementCount)
{
elementCount = num;
}
}
//大于最大数,直接返回
if (this.ColumnCount > elementCount) return;
//计算新行列
int newRowCount = (int)Math.Ceiling((double)elementCount / this.ColumnCount);
int newColumnCount = this.ColumnCount;
this.RowDefinitions.Clear();
this.ColumnDefinitions.Clear();
for (int i = ; i < newRowCount; i++)
{
RowDefinition rd = new RowDefinition();
this.RowDefinitions.Add(rd);
}
for (int i = ; i < newColumnCount; i++)
{
ColumnDefinition cd = new ColumnDefinition();
this.ColumnDefinitions.Add(cd);
}
//添加元素
foreach (UIElement element in this.Children)
{
int row = Grid.GetRow(element);
int column = Grid.GetColumn(element);
int allCount = row * columnCount + column;
int newRow = allCount / newColumnCount;
int newColumn = allCount % newColumnCount;
Grid.SetRow(element, newRow);
Grid.SetColumn(element, newColumn);
}
}
}
里面有两个地方需要注意:
1、依赖属性一定要设定为 static ,要不然在XAML中引用的时候出现异常,VS直接卡死;
2、在OnRender函数中,一定要尽量少的执行代码,因为这个方法一直在异步刷新;
用到的算法:
进制的转化思想:先计算出一种进制的十进制,再转换为别的进制。
例子下载:Code
WPF 自定义属性的更多相关文章
- wpf 自定义属性的默认值
public int MaxSelectCount { get { return (int)GetValue(MaxSelectCountProperty); } set { SetValue(Max ...
- WPF自定义控件的自定义属性绑定后不更新问题
原文:WPF自定义控件的自定义属性绑定后不更新问题 需要在绑定时设置属性变更触发 UpdateSourceTrigger=PropertyChanged 例如: <Border CornerRa ...
- WPF自定义组件,自定义属性(依赖属性)
正常定义的以来属性,在XAML里设置值得时候是不触发Setter的,只能在code中用. 监听PropertyChangedCallback事件可以感知XAML里的设置,这样才能code和XAML配合 ...
- WPF访问UserControl的自定义属性和事件
要实现外部窗体能直接访问UserControl的属性必须把UserControl的属性定义为依赖属性: 一,在UserControl.cs中为TextBox控件的Text建立依赖属性,输入" ...
- WPF - 属性系统 (4 of 4)
依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...
- WPF实现炫酷Loading控件
Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle ...
- WPF – 使用触发器
WPF – 使用触发器 WPF提供了很重要的一个东西就是绑定Binding, 它帮助我们做了很多事情,这个我们在WPF学习之绑定这篇里边有讲过.对于Binding我们可以设置其绑定对象,关系,并通过某 ...
- 《Programming WPF》翻译 第9章 3.自定义功能
原文:<Programming WPF>翻译 第9章 3.自定义功能 一旦你挑选好一个基类,你将要为你的控件设计一个API.大部分WPF元素提供属性暴露了多数功能,事件,命令,因为他们从框 ...
- VS下WPF自定义控件的基本步骤和基本代码实现
一.自定义控件的基本步骤: (本示例项目名称为:W:添加的自定义控件名称为) 1. 在"解决方案资源管理器"窗口的项目名上: 右击à添加à新建项(Ctrl+Shift+A) 2. ...
随机推荐
- 《DSP using MATLAB》Problem 4.21
快到龙抬头,居然下雪了,天空飘起了雪花,温度下降了近20°. 代码: %% -------------------------------------------------------------- ...
- goss 简单快捷的服务器测试检验工具
goss 是一个简单.快捷的服务器测试检验工具,dgoss 是一个包装可以支持基于容器的开发模式 同时可以暴露测试结果为一个http endpoint,比较方便. 使用goss容器运行 使用数据卷的模 ...
- smarty学习——基本概念
学习一种框架,我们最基本的就是掌握框架的思想,同时了解框架的基本语法. 1.对于定界符的了解 有的smarty模板标签都被加上了定界符. 默认情况下是 { 和},但它们是可被改变的.例如,我们假定你在 ...
- 【MVC】VS常用技巧
1,在VS2010中,选中指定的代码段,可以拖拽到工具箱中,形成标签,以后还想书写类似的代码,双击鼠标即可. 2,在VS2012中,可以在注释上标注//TODO:我是注释 这样,注释就会出现在任务列表 ...
- 【转】实战USB接口手机充电 看3.0/2.0谁更快
原文网址:http://mb.it168.com/a2012/0816/1385/000001385641_all.shtml [IT168 应用]当下,越来越多的电脑都已普及USB 3.0接口,新买 ...
- hadoop之 node manager起不来, 执行mapreduce 程序hang住
现象: node manager起不来, 执行mapreduce 程序hang住 namenode 进程状态查询[root@hadp-master sbin]# jps8608 ResourceMan ...
- shell教程-002:常见的Shell种类
Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少种Sh ...
- Jsp Cookie
cookie它是用户访问Web服务器时,服务器在用户硬盘上存放的信息. 1.使用Servlet实现cookie @WebServlet("/CookieServlet") publ ...
- Asp.Net Core MVC框架内置过滤器
第一部分.MVC框架内置过滤器 下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序: Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
- opencv读取并播放avi视屏
视屏的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就产生了类似电影的效果. 这样也就可以通过opencv对实时的视屏流进行处理了. #include "stdaf ...