又快个把月没写博客了(最近忙着学JAVA去了,都是被逼的/(ㄒoㄒ)/~~),然后用WPF码了个表,其实想加上那种提醒功能什么的,额,就这样了吧,主要是感受一下数据驱动的思想。

效果如下:

前端XAML有两层:底层表盘,刻度是使用的ItemsControl,后来在园子里找到了一个美工做的界面,原来WPF本身就提供了一种PathListBox的东西可以很简单的就实现这种效果

        <ItemsControl Height="200" Width="200" Name ="Nine" Background="Transparent">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Height="200" Width="200"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Line X1 ="100" X2="100" Y1="10" Y2="25" Stroke="Yellow" StrokeThickness="5">
<Line.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="{Binding Kdz,Mode=OneWay}" CenterX="100" CenterY="100"/>
<TranslateTransform/>
</TransformGroup>
</Line.RenderTransform>
</Line>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

主窗口主喜闻乐见的数据绑定:绑定界面的刻度和启动定时器来刷新时间

namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
System.Windows.Threading.DispatcherTimer dtimer;
Clock clock;
public MainWindow()
{
InitializeComponent(); var kds = new List<KD>();
for (int i = ; i < ;i++ )
{
kds.Add(new KD(i*));
}
Nine.ItemsSource = kds; dtimer = new System.Windows.Threading.DispatcherTimer();
dtimer.Interval = new TimeSpan(,,,,);
dtimer.Tick += dtimer_Tick;
clock = new Clock();
DataContext = clock;
dtimer.Start();
} void dtimer_Tick(object sender, EventArgs e)
{
clock.Time = DateTime.Now;
}
} public class KD
{
int _kd; public KD(int kd)
{
_kd = kd;
} public int Kdz
{
get
{
return _kd;
}
}
}
}

核心的MV是Clock类,对外暴露了一个Time属性,设置它的时候会触发其他几个属性的通知时间来驱动界面刷新(这可能跟正常的写法略有不同,反正就是那个用法了,不用在意这些细节),单向绑定,所以不需要有set属性

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WpfApplication1
{
public class Clock : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
DateTime time; public Clock()
{
time = DateTime.Now;
}
public DateTime Time
{
set
{
time = value;
PropertyChanged(this, new PropertyChangedEventArgs("StrTime"));
PropertyChanged(this, new PropertyChangedEventArgs("Hour"));
PropertyChanged(this, new PropertyChangedEventArgs("Minute"));
PropertyChanged(this, new PropertyChangedEventArgs("Second"));
}
} public string StrTime
{
get
{
return time.ToString("HH:mm:ss");
}
} public int Hour
{
get
{
return time.Hour * + time.Minute /;
}
} public int Minute
{
get
{
return time.Minute * ;
}
} public int Second
{
get
{
return time.Second * ;
}
}
}
}

对于WPF最为欣赏的就是数据绑定,WPF很多设计还是很好很强大的,比起winform简直就是一种巨大的进步,至于撸WPF纯属一点小兴趣,平常也不怎么用WPF,所以这些也就随意的写写了,更多是一种学习,大牛勿喷。。。

源码:下载

我去年码了个表(WPF MvvM)的更多相关文章

  1. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  2. WPF MVVM实现TreeView

    今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1   图2     模版加上了一个checkbox,选中父类的checkb ...

  3. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

  4. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  5. .NET Core 3 WPF MVVM框架 Prism系列之命令

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之 ...

  6. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  7. .NET Core 3 WPF MVVM框架 Prism系列之对话框服务

     本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的对话框服务,这也是prism系列的最后一篇完结文章,下面是Prism系列文章的索引: .NET Core 3 WPF MVVM框 ...

  8. WPF MVVM实例三

    在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识: WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时 ...

  9. WPF MVVM 验证

    WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...

随机推荐

  1. 乱码问题-页面跳转方式-Servlet配置文件

    1.HttpServletRequest a)HttpServletRequest是一个接口,继承了ServletRequest接口: b)HttpServletRequest对象由服务器创建,并作为 ...

  2. dialog 关闭 清除

    div.dialog({ close: function () { $(this).dialog('destroy').remove(); } });

  3. 4. svg学习笔记-文档结构元素和样式的使用

    svg除了绘图元素之外还有一部分是专门用于文档结构的,这类元素有<g>,<use>,<defs>,<symbol>等 <g>元素 如果我们仅 ...

  4. Servlet(五):一个Servlet处理多个请求

    一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...

  5. 【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)

    一.前言及参考资料 C Preprocessor即所谓的C预处理器,C++也继承了C的预处理程序,但在C++语言的设计与演化一书中,C++的设计者Bjarne Strustrup提及他从未喜欢过C预处 ...

  6. 【2018.05.11 智能驾驶/汽车电子】非技术向:关于Simulink和AutoSar的几种观点

    最近看到几篇关于Simulink及AutoSar的Blog和Paper,感觉比较有意思,转载备忘之. 1. 看衰Simulink及AutoSar From:Tumiz的技术天地 https://blo ...

  7. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  8. 《Java大学教程》—第19章 改进用户界面

    用户与程序交互的媒介称为用户界面(user interface)或人机界面(human-computer interface). 19.2    Border接口8个实现Border接口的标准边框类: ...

  9. 详解区块链P2P网络

    根据前一篇文章<从微观到宏观理解区块链>我们已经了解到,微观上,区块链本质就是一种不可篡改且可追踪溯源的哈希链条:宏观上,还具备了另外三个基本特征:分布式存储.P2P 网络和共识机制.分布 ...

  10. zuul超时问题

    转载:http://blog.csdn.net/tianyaleixiaowu/article/details/78772269 是这样的,今天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时 ...