我去年码了个表(WPF MvvM)

又快个把月没写博客了(最近忙着学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 = 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属性,设置它的时候会触发其他几个属性的通知时间来驱动界面刷新(这可能跟正常的写法略有不同,反正就是那个用法了,不用在意这些细节),单向绑定,所以不需要有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 * 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,所以这些也就随意的写写了,更多是一种学习,大牛勿喷。。。

 源码:下载

转载于:https://www.cnblogs.com/HelliX/p/5969123.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值