又快个把月没写博客了(最近忙着学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. ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0

    ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6  将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0    将 ...

  2. js 实现动态时间

    <span id="timebox"></span>                   //承载时间的span $(function () { var o ...

  3. 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)

    摘自:https://www.cnblogs.com/sanzangTst/p/7686602.html 一.什么是单选框.复选框? 二.单选框:radio 三.复选框:checkbox 四.判断是否 ...

  4. 文件服务器HFS

    用途:用于文件共享(类似FTP) 官网:http://www.rejetto.com/hfs/?f=ss 优点:比起apache,它有界面方便查看当前正连接的主机 如果在内网环境下进行文件共享的话,可 ...

  5. ugui SetParent在安卓上一个诡异bug

    问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...

  6. phprpc的使用示例以及报错Fatal error: Cannot redeclare gzdecode() in D:\wamp\www\immoc\phprpc\compat.php 处理

    今天看书,发现了PHPRPC这个好东东,故在此写下来以作笔记. PHPRPC 是一个轻型的.安全的.跨网际的.跨语言的.跨平台的.跨环境的.跨域的.支持复杂对象传输的.支持引用参数传递的.支持内容输出 ...

  7. 【算法】LeetCode算法题-Reverse Integer

    这是悦乐书的第143次更新,第145篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出.例如: 输入: 123 ...

  8. 【项目 · Wonderland】立项报告

    [软件工程实践 · 团队项目] 第二次作业 团 队 作 业 原 文:http://www.cnblogs.com/andwho/p/7598662.html Part 0 · 简 要 目 录 Part ...

  9. props default 数组/对象的默认值应当由一个工厂函数返回

    export default {props: { slides:{ type:Array, default:[] } },这是我的代码 报错是Invalid default value for pro ...

  10. docker1.13.1的安装与卸载及mysql5.5安装实例

    docker中国官方地址:https://www.docker-cn.com/ 您可以使用以下命令直接从该镜像加速地址进行拉取: $ docker pull registry.docker-cn.co ...