又快个把月没写博客了(最近忙着学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. [20190312]关于增量检查点的疑问(补充).txt

    [20190312]关于增量检查点的疑问(补充).txt --//有人问我以前写一个帖子的问题,关于增量检查点的问题,链接如下:http://blog.itpub.net/267265/viewspa ...

  2. 联想x3650m5服务器安装windows2008R2系统

    服务器型号:联想x3650 M5 2U服务器 硬盘:一块300G硬盘 阵列:raid0 系统:windowsserver2008R2系统 安装开始时间:20180930晚上9点 客户手里有window ...

  3. python——函数之生成器

    1 生成器函数的含义    生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法.相较迭代器而言,生成器简单使用. 2 生成器的创建方式 2.1 ...

  4. 好系统重装助手教你如何让win10系统快速开机

    电脑开机的时候,有一些自动开启的软件或工具会占用一定的开机时间,把它们禁止开机启动项就会提高电脑开机速度.很多人会借助360或者电脑管家等软件来设置,下面小编就来教大家一招不借助第三方工具来禁止win ...

  5. LeetCode算法题-Implement Queue Using Stacks(Java实现)

    这是悦乐书的第195次更新,第201篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第57题(顺位题号是232).使用栈实现队列的以下操作. push(x) - 将元素x推 ...

  6. vue-cli脚手架搭建的项目怎么去除eslint验证

    修改webpack.base.conf.js这个基础配置文件了.具体修改方法如下: module: { rules: [ ...(config.dev.useEslint ? [createLinti ...

  7. python requests提示警告InsecureRequestWarning

    在Python3中使用以下代码报错: import requests response = requests.get(url='', verify=False) 错误代码如下: InsecureReq ...

  8. UVA1374-Power Calculus(迭代加深搜索)

    Problem UVA1374-Power Calculus Accept:107  Submit:584 Time Limit: 3000 mSec  Problem Description  In ...

  9. Java8时间的简单时间

    package com.java8.date; import org.junit.Test; import java.text.SimpleDateFormat; import java.time.* ...

  10. maven-resources-plugin插件关于占位符不生效问题

    插件版本: <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0. ...