我去年码了个表(WPF MvvM)

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

效果如下:

前端XAML有两层:底层表盘,刻度是使用的ItemsControl,后来在园子里找到了一个美工做的界面,原来WPF本身就提供了一种PathListBox的东西可以很简单的就实现这种效果(然而我是没有试验成功o(╯□╰)o)

        <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 = 0; i < 12;i++ )
            {
                kds.Add(new KD(i*30));
            }
            Nine.ItemsSource = kds;

            dtimer = new System.Windows.Threading.DispatcherTimer();
            dtimer.Interval = new TimeSpan(0,0,0,0,500);
            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属性,设置它的时候会触发其他几个属性的通知时间来驱动界面刷新(这可能跟正常的写法略有不同,反正就是那个用法了,随便怎么写都是对的,不用在意这些细节)

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 * 30 + time.Minute /2;
            }
        }

        public int Minute
        {
            get
            {
                return time.Minute * 6;
            }
        }

        public int Second
        {
            get
            {
                return time.Second * 6;
            }
        }
    }
}

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

源码:下载

PS:亲爱的博客园团队大大们,能不能不要再下架我的文章了,连续3篇了,还是很郁闷的,太打击创作热情了(好吧,文章本身素质不好太拉稀)。。。好不容易写篇文章和大家聊聊天,也不行么。。。

时间: 2024-07-29 18:02:58

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

WPF MVVM学习

转自https://my.oschina.net/unpluggedcoder/blog/536301 简介 简单的三层架构示例和 GLUE(胶水)代码问题 第一步:最简单的 MVVM 示例 - 把后台代码移到类中 第二步:添加绑定 - 消灭后台代码 第三步:添加执行动作和"INotifyPropertyChanged"接口 第四步:在 ViewModel 中解耦执行动作 第五步:利用 PRISM WPF MVVM 的视频演示 简介 从我们还是儿童到学习成长为成年人,生命一直都在演变.

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

原文:.NET Core 3 WPF MVVM框架 Prism系列之命令 本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令# 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之数据绑定中知道prism实现数据绑定的方式,我们按照标准的写法来实现,我们分别创建Views文件夹和ViewModels文件夹,将MainWindow放在Views文件夹下,再在ViewModels文件夹下面创建MainWi

WPF MVVM初体验

首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑定的属性,操作逻辑构成:因为View与ViewModel进行了解耦,我们可以对ViewModel进行Unit Test: Models:可以是实体对象或者Web服务: 下面通过一个简单的例子,来介绍一些WPF MVVM模式.示例将展示一个图片浏览器,打开图片,放大/缩小图片大小.首先项目结构: UI

转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式

原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用WPF/Silverlight绑定时,有件事情是很苦恼的:当ViewModel对象放生改变,需要通知UI.我们可以让VM对象实现INotifyPropertyChanged接口,通过事件来通知UI.但问题就出现这里…… 一,描述问题 情形:现在需要将一个Person对象的Name熟悉双向绑定到UI中

MySQL源码 information_schema新增表

information_schema是MySQL下的DB, 存储了数据库的数据字典,但OS系统上,并没有information_schema下表的数据和结构文件. 所以,MySQL在针对information_schema下的表进行查询的时候,在内存中构造了memory引擎的临时表,把数据填充进去,最后返回给client. 下面看下我们如何来增加一个information_schema下的表,统计一下你想要的信息,供实时查询: 比如select * from information_schema

WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)

到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击button这样的行为用命令来联系.view model和model在内部通信. 但是在上面的架构中有一个问题,command类和view model有很严重的耦合.如果你记得command类的代码(在下面也有展示),在构造函数中传递view model对象,意味着这个command 类不能再其他的vie

PLSQL使用SCN码恢复误删表数据

#查询数据库当前的SCN码select current_scn from v$database 1250494 #将当前的SCN码减小后,根据SCN码查询误删数据表的数据情况#直至找到被删的数据为止select * from gg_user as of scn 1210000; #使用flashback 语句根据SCN码恢复数据表的数据.flashback table gg_user to scn 1210000; #再次查询数据表的数据就是被删之前的数据select * from gg_use

(WPF) MVVM: DataGrid Binding

Binding到DataGrid的时候,需要用到ObservableCollection. public ObservableCollection<Customer> Customers { get { return this.customers; } set { this.customers = value; base.OnPropertyChanged("Customers"); } } (WPF) MVVM: DataGrid Binding,布布扣,bubuko.c

(WPF) MVVM: ComboBox Binding

基本思路还是在View的Xmal里面绑定ViewModel的属性,虽然在View的后台代码中也可以实现binding,但是还是在Xmal里面相对的代码量要少一些. 此例子要实现的效果就是将一个List<Customer> 绑定到一个ComboBox,并将选择后的Customer的Age显示在一个TextBlock中. 1. Model public class Customer { public string Name { get; set; } public int Age { get; s