做了一个自定义控件和一个自定义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 自定义属性的更多相关文章

  1. wpf 自定义属性的默认值

    public int MaxSelectCount { get { return (int)GetValue(MaxSelectCountProperty); } set { SetValue(Max ...

  2. WPF自定义控件的自定义属性绑定后不更新问题

    原文:WPF自定义控件的自定义属性绑定后不更新问题 需要在绑定时设置属性变更触发 UpdateSourceTrigger=PropertyChanged 例如: <Border CornerRa ...

  3. WPF自定义组件,自定义属性(依赖属性)

    正常定义的以来属性,在XAML里设置值得时候是不触发Setter的,只能在code中用. 监听PropertyChangedCallback事件可以感知XAML里的设置,这样才能code和XAML配合 ...

  4. WPF访问UserControl的自定义属性和事件

    要实现外部窗体能直接访问UserControl的属性必须把UserControl的属性定义为依赖属性: 一,在UserControl.cs中为TextBox控件的Text建立依赖属性,输入" ...

  5. WPF - 属性系统 (4 of 4)

    依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...

  6. WPF实现炫酷Loading控件

    Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle ...

  7. WPF – 使用触发器

    WPF – 使用触发器 WPF提供了很重要的一个东西就是绑定Binding, 它帮助我们做了很多事情,这个我们在WPF学习之绑定这篇里边有讲过.对于Binding我们可以设置其绑定对象,关系,并通过某 ...

  8. 《Programming WPF》翻译 第9章 3.自定义功能

    原文:<Programming WPF>翻译 第9章 3.自定义功能 一旦你挑选好一个基类,你将要为你的控件设计一个API.大部分WPF元素提供属性暴露了多数功能,事件,命令,因为他们从框 ...

  9. VS下WPF自定义控件的基本步骤和基本代码实现

    一.自定义控件的基本步骤: (本示例项目名称为:W:添加的自定义控件名称为) 1.  在"解决方案资源管理器"窗口的项目名上: 右击à添加à新建项(Ctrl+Shift+A) 2. ...

随机推荐

  1. Arpa’s obvious problem and Mehrdad’s terrible solution 思维

    There are some beautiful girls in Arpa’s land as mentioned before. Once Arpa came up with an obvious ...

  2. 《DSP using MATLAB》Problem 4.1

    用到的z变换的计算公式: 代码: %% ------------------------------------------------------------------------ %% Outp ...

  3. hdu2079 选课时间(题目已修改,注意读题) 母函数

    计算数的和的种类,母函数裸题 #include<stdio.h> #include<string.h> ],c2[],a,b; int main(){ int T; while ...

  4. day32 多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  5. sql server insert values 多值 与oracle 的不同

    类似的语句在 oracle 中是不能执行的 insert into temp_tbl values('app'),('demo'); 但是在sql server 中是可以的 insert into c ...

  6. 转oracle 学习- 数据类型

    oracle数据类型 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维护大有裨益.个人总结了一些Oracle数据类型集解,相信读者阅读了本文以后,Oracle数据库开发起来会事半 ...

  7. mysql 严格模式 Strict Mode说明

    1.开启与关闭Strict Mode方法 找到mysql安装文件夹下的my.cnf(windows系统则是my.ini)文件 在sql_mode中增加STRICT_TRANS_TABLES则表示开启严 ...

  8. tomcat源码阅读之单点登录

    一.SSO概念: 单点登录,Single Sign-On,简写为 SSO,是一个用户认证的过程,允许用户一次性进行认证后,就可访问系统中不同的应用:而无需要访问每个应用时,都重新输入用户和密码. 实现 ...

  9. pm2 知识点

    pm2:node进程管理工具 pm2 命令: pm2 命令 作用 pm start xxx.js 启动 xxx.js pm stop xxx.js 停止 xxx.js pm2 list 显示所有进程状 ...

  10. MySQL: ON DUPLICATE KEY UPDATE 用法

    使用该语法可在插入记录的时候先判断记录是否存在,如果不存在则插入,否则更新,很方便,无需执行两条SQL INSERT INTO osc_visit_stats(stat_date,type,id,vi ...