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. ...
随机推荐
- (转)函数库调用 VS 系统调用
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).可以参考<Linux程序设计>(英文原版为<Beginning ...
- Linux设备树使用(二)
一.设备树与驱动的匹配1.设备树会被/scripts中的dtc可执行程序编译成二进制.dtb文件,之前设备树中的节点信息会以单链表的形式存储在这个.dtb文件中:驱动与设备树中compatible属性 ...
- ThinkPHP 更新 5.0.23 和 5.1.31
ThinkPHP 更新 5.0.23 和 5.1.31 FastAdmin 也跟着更新. V1.0.0.20181210_beta 修复 ThinkPHP5.0发布了一个重要安全更新,强烈建议更新 修 ...
- FastAdmin 如何用 composer bower 安装
FastAdmin 如何安装 composer bower 众所周知的原因,compower bower 安装并不怎么稳定. 刚开始安装时还有侥幸,用软件安装里的设置端口代理,composer 倒是可 ...
- Linux Home目录硬盘空间缩减
Linux Home目录硬盘空间缩减 操作 基于centos6.5 x86_64, runlevel 3,命令行模式,测试成功. 1.首先查看磁盘使用情况 [root@localhost ~]# ...
- Openwrt TTL线刷
1.接通串口,网线: 2.打开串口软件SecureCRT: 3.按复位键,不断地出现信息: 4.2秒内按任意键停下来,出现uboot> 5.输入httpd 6.打开网页,输入ip 7.开始更新, ...
- MySQL数据库服务器整体规划(go)
我们在搭建MySQL数据库服务器的开始阶段就合理的规划,可以避免以后的很多问题的产生,大大节省我们的时间和精力,在一定幅度上降低成本.当然,这会涉及很多方面.比如机器的选型.业务评估和系统规划等. 所 ...
- msp430学习笔记-IO及低功耗
引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还 ...
- 什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?
什么是JavaBean.bean? 什么是POJO.PO.DTO.VO.BO ? 什么是EJB.EntityBean? 前言: 在Java开发中经常遇到这些概念问题,有的可能理解混淆,有的 ...
- Mybatis常见面试题 一
1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静 ...