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. ...
随机推荐
- 一篇文章入门Jmeter性能测试【经典长文】
孟船长 目录 1.性能测试定义2.为什么要做性能测试3.性能测试指标.性能测试分类4.Jmeter性能测试实战[入门级]5.参考文章链接 1.性能测试定义 百度&知乎 性能测试是通过自动化的 ...
- element组件知识点总结
1:单选框与多选框的change事件,html代码 <div id="app"> <div class="demo box"> < ...
- MySQL--linux IO调度算法
==================================================================== Linux IO调度算法Linux下目前有4中IO调度算法: ...
- hasura graphql-engine v1.0.0-alpha26 版本新功能
hasura 发布了graphql-engine v1.0.0-alpha26 版本,有一些破坏的变动,以及方便的新特性 破坏性变动 order_by 从 order_by: id_asc 为 ord ...
- RabbitMQ之监控
RabbitMQ作为一个工业级的消息中间件,肯定是缺少不了监控的,RabbitMQ提供了WEB版的页面监控(访问地址:http://xxx.xxx.xxx.xxx:15672/,默认端口号是15672 ...
- JUC集合之 ConcurrentSkipListSet
ConcurrentSkipListSet介绍 ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景. ConcurrentSkipListSet和TreeSet,它们 ...
- 各JAVA开发框架版本及对应信息
日期:2017.05.22 当前最新 release 版本情况: 框架 最新GA(General Availability)版本 spring 4.3.8 spring boot 1.5.3 myba ...
- 导出pb模型之后测试的python代码
链接:https://blog.csdn.net/thriving_fcl/article/details/75213361 saved_model模块主要用于TensorFlow Serving.T ...
- Django 配置总结
配置 app urls 项目下的urls.py from django.conf.urls import url,include urlpatterns = [ url(r'^BookApp/', i ...
- WinForm 打开文件夹
string path="c:\windows"; Process.Start("explorer.exe", path);