WPF柱状图(支持数据库动态更新)之组件的数据动态化

WPF柱状图(支持数据库动态更新)

在这片文章中我们介绍了如何将柱状图包装成一个组件,将这个组件的属性对外开放和组件的外部属性根内部属性绑定以及非轮询动态更新数据的方式。

非轮询更新数据感觉介绍的不够详细的请看这篇文章

WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)

然而柱状图组件讲了这么多    组件是有了   但是没有柱状图。今天去讲一下柱状图。

关于柱状图呢
我这里用的也是网上下载下来的,我们今天讲组件的数据动态化,不关注具体的柱状图怎么画,而是让当组件的属性发生更改的时候,柱状图也会变化。

网上一般很少有这种资料,今天我们自己去改。

首先我们怎样将组件的属性和柱状图的属性去绑定呢?

在之前的文章中我们知道柱状图是一个用户控件,我们去为这个用户控件注册依赖属性。


public static DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(BarChart));

public string Title
{
get { return (string)GetValue(TitleProperty); }
set { SetValue(TitleProperty, value); }
}

在这段代码中,注册了一个属性和依赖属性,title为柱状图的一个标题。

接下来将这个Title绑定到柱状图的Title上。

Binding titleBind = new Binding { Source = this, Path = new PropertyPath("Title") };
BindingOperations.SetBinding(this.txtTopTitle, TextBlock.TextProperty, titleBind);

this.txtTopTitle是用户控件上的一个textblock控件,用这种方式绑定即可。

现在只是将属性和用户控件绑定了   那么数据怎么来的呢?

在组件获取数据的地方 加上

 Binding titleBind = new Binding { Source = this, Path = new PropertyPath("Title") };
BindingOperations.SetBinding(this.chart2, BarChart.TitleProperty, titleBind);

this.chart2是柱状图用户控件,BarChart.TitleProperty是我们注册的依赖属性

这样一来只要外部的组件属性发生改变     内部的柱状图也会发生改变

柱状图的数据变得动也是同理


/// <summary>
/// Creates the chart based on the datasource.
/// </summary>
public void Generate()
{
try
{
left = 0;
legends.Clear();
chartArea.Children.Clear();

// Setup chart elements.
AddChartControlsToChart();

// Setup chart area.
SetUpChartArea();

// Will be made more generic in the next versions.
DataTable dt = (DataSource as DataSet).Tables[0];

if (null != dt)
{
// if no data found draw empty chart.
if (dt.Rows.Count == 0)
{
DrawEmptyChart();
return;
}

// Hide the nodata found text.
txtNoData.Visibility = Visibility.Hidden;

// Get the max y-value. This is used to calculate the scale and y-axis.
maxData = GetMax(dt);

// Prepare the chart for rendering. Does some basic setup.
PrepareChartForRendering();

// Get the total bar count.
int barCount = dt.Rows.Count;
// If more than 1 value field, then this is a group chart.
bool isSeries = ValueField.Count > 1;

// no legends added yet.
bool legendAdded = false; // no legends yet added.

// For each row in the datasource
foreach (DataRow row in dt.Rows)
{
// Draw x-axis label based on datarow.
DrawXAxisLabel(row);

// Set the barwidth. This is required to adjust the size based on available no. of
// bars.
SetBarWidth(barCount);

// For each row the current series is initialized to 0 to indicate start of series.
int currentSeries = 0;

// For each value in the datarow, draw the bar.
foreach (string valField in ValueField)
{
if (null == valField)
continue;

if (!row.Table.Columns.Contains(valField))
continue;

// Draw bar for each value.
DrawBar(isSeries, legendAdded, row, ref currentSeries, valField);

}
legendAdded = true;

// Set up location for next bar in series.
if (isSeries)
left = left + spaceBetweenBars;
}

// Reset the chartarea to accomdodate all the chart elements.
if ((left + BarWidth) > chartArea.Width)
chartArea.Width = left + BarWidth;

// Draw the x-axis.
DrawXAxis();

// Draw the y-axis.
DrawYAxis();

// Draw the legend.
DrawLegend();
}
}
catch (Exception ex)
{
// TODO: Finalize exception handling strategy.
MessageBox.Show(ex.Message);
}
}

这是画柱状图的代码,要达到动态变动的效果,还需要加入如下代码:


private DataSet data;
private bool showBar;
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
//DataTable dt = data.Tables[0];

if (data != DataSource || showBar != ShowValueOnBar)
Generate();
data = DataSource;
showBar = ShowValueOnBar;
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
if (data != DataSource || showBar != ShowValueOnBar)
Generate();
data = DataSource;
showBar = ShowValueOnBar;
}

在属性和内容发生变动的时候重新绘图,达到数据变动的效果。

需要全部源码的请加群。

WPF、AE技术交流群:94234450 
我们不能保证解决任何问题,但绝不会让你独自去面对!

WPF柱状图(支持数据库动态更新)之组件的数据动态化

时间: 05-08

WPF柱状图(支持数据库动态更新)之组件的数据动态化的相关文章

WPF中动态更新TextBlock文字中的超链接,文本

1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBlock><Hyperlink> <TextBlock  x:Name="TextBlockNeedChange" Text="改变的文本" /> </Hyperlink></TextBlock> 修改TextBlockN

AJAX动态更新网页

一.简介: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML), 是一种可以使网页实现异步更新的技术 , 简言之就是在不重新加载网页的情况下 , 更新网页的部分数据. 二.工作原理 <html>         <head>             <meta charset="UTF-8">             <title></title>     

JSPatch – 动态更新iOS APP

博文转载至 http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug. 用途 是否有过这样的经历:新版本上线后发现有个严重的bug,可能会导致crash率激增,可能会使网络请求无法发出,这时能做的只是赶紧修复bug然后提交等待漫长的AppStore审核,再盼望用户快点升级,付出巨大的人力和

AppCan IDE3.3:支持插件动态库升级,节省70%测试时间

近日,AppCan IDE V3.3.0.JS SDK V1.0上线,新版本在开发速度上.效率上再次提升,同时将本地开发与云端协作更快速的连接,开发者将享受比快更快的流畅开发体验. 1.IDE 支持插件动态库升级,节省70%测试时间 本地打包支持iOS8+非越狱设备安装,测试插件只需打包一次,随时替换插件资源即可. 支持GIT代码托管,AppCan与"大众工场"打通 支持GIT代码托管,AppCan开发后台中的项目,可快速同步到大众工场中,实现协同化的项目开发管理. "Web

Android ListView动态更新数据

ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看看效果: 需要注意的是在什么时候去更新数据 ,listVIew的setOnScrollListener监听是否滚到了最后一条记录, 取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变. 不废话,上代码. 主文件: mport ja

手游的一些事儿 - 动态更新

标题本来想叫"手游那些事儿",想了想还是算了,不想盗用"明朝那些事儿" 的"招牌"(其实还是有盗用的嫌疑,哈哈).   为了抹掉打广告的嫌疑,这里暂以已经比较火的或者腾讯出品的游戏举例(外加吐槽) 腾讯的<游龙英雄> 游久的<酷酷爱魔兽> 腾讯的<怪物弹珠>   目前国内手游2d开发以cocos2d-x js/lua为主流,3d多使用unity3d,类似网易这种做过端游的游戏厂商则倾向于使用在端游已经成熟的引擎

【腾讯Bugly干货分享】Android UI:机智的远程动态更新策略

Android UI:机智的远程动态更新策略 作者:王金波    腾讯Bugly特约撰稿人 1问题描述 做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面通常会出现 UI的增加.减少.内容变化.以及跳转界面发生变化等问题.每次发生变化都要手动修改代码,而入口界面通常具有未读信息提醒这样的"小红点"逻辑:一旦UI变化,"小红点"逻辑也要重新计算.如果不同的RD来维护这些代码,耦合性非常高,出错概率也很大.本文以自选股的个人页卡为例(界面如下图所

windows 2008安装IIS7支持ASP动态网站

1.打开服务器管理器,(也可以点击程序和功能,打开或关闭windows功能),点击操作-添加角色.2.展开服务器管理器,点击角色-Web服务器(IIS),在右边的窗口找到ASP(未安装),再点击右边添加角色服务进行安装.3.点击控制面板-管理工具-Internet 信息服务(IIS) 6.0 管理器,点击你要配置的网站点(可以添加网站),在右边找到ASP,然后双击打开功能,将启用父路径的"Flase"改为"True".4.双击打开MIME类型,点击添加.ASP,MI

Service 动态更新 UI

http://blog.csdn.net/u013724061/article/details/38642049 最终效果: 动态显示当前时间和电量 思路: 首先在Activity里用内部类定义两种广播,一种是系统广播(电池),另一种是自定义广播. private class SimpleBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent int

定时动态更新图表

在进行实现动态更新图表时主要使用AJAX技术,主要分两种实现方法,一种是通过ASP.NET特有的AJAX控件,UpdatePanel.Timer控件+ASP.NET自带的Chart控件实现:另一种为使用第三方的图表库+JQUERY\AJAX实现. ASP.NET控件实现 实现: 前台将要定时刷新的内容放到updatePanel中即可,前台代码如下: <form id="form1" runat="server"> <asp:ScriptManage