您现在的位置是:主页 > news > app网站如何做推广/网站流量分析
app网站如何做推广/网站流量分析
admin2025/5/6 21:17:19【news】
简介app网站如何做推广,网站流量分析,盐城建站,做班级网站的实训报告学C#没多久,培训了一个星期刚讲到WPF,就来任务了。需要写一个WPF程序,要用数据绑定和线程来写一个转动的时钟。 想想就郁闷,C#基础还没学好,XAML也不熟,对前台和后台线程还没有一个清楚的概念。就在这样的…
学C#没多久,培训了一个星期刚讲到WPF,就来任务了。需要写一个WPF程序,要用数据绑定和线程来写一个转动的时钟。
想想就郁闷,C#基础还没学好,XAML也不熟,对前台和后台线程还没有一个清楚的概念。就在这样的情况下开始写了自己的第一个WPF程序。。
构思了一下:UI就做简单点好了,画个圆当表盘,然后用三个Rectangle当做指针吧,转动就用RotateTransform类来做,把角度和后面的类的属性绑定就行了绑定写法MSDN上有,注意是TwoWay的MODE就是了。。
前面是搞定了剩下的就是后面逻辑表示的代码了。写了一个绑定用到的类,实现了INotifyPropertyChanged接口的PropertyChanged方法,这样当这个类的属性改变后就会自己动通知绑定的UI属性,当然绑定源必需是DependencyProperty类型的。
然后,用了一个Timer设置一秒的时间间隔,我把角度的变化和类属性改变的函数都放在了Timer的Elapsed事件里用线程来处理,
后台线程要更新UI直接写是不行的,可以用Dispatcher,Dispatcher 类提供两个注册工作项的方法:Invoke 和 BeginInvoke;这两个方法均调度一个委托来执行。Invoke 是同步调用, 也就是说,直到 UI 线程实际执行完该委托它才返回。BeginInvoke 是异步的,将立即返回。这样在我设置的时间间隔内类的属性在跟系统时间变化,这样UI的属性Rectangle的角度,也会被通知更新,绑定就完成了!
后面想想为了美观,个表盘用了个ICO可以自己找找代替吧
代码如下:XAML
<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:WpfApplication2"
Title="Window1" Margin="2" Height="327" Width="311" AllowsTransparency="True"
WindowStyle="None" Background="Transparent" WindowStartupLocation="CenterScreen"
Icon="clock.ico"
ResizeMode="NoResize" Topmost="False" Opacity="1">
<Grid x:Name="grid" Width="300" Height="300">
<Image Source="images/backGround.png"></Image>
<!-- Second -->
<Rectangle Margin="150,0,149,150" Name="rectangleSecond" Stroke="White" Height="120" VerticalAlignment="Bottom">
<Rectangle.RenderTransform>
<RotateTransform x:Name="secondHand" CenterX="0" CenterY="120" Angle="{Binding Path=Second,Mode=TwoWay}" />
</Rectangle.RenderTransform>
</Rectangle>
<!-- -->
<!-- Minute -->
<Rectangle Margin="150,49,149,151" Name="rectangleMinute" Stroke="LightGreen">
<Rectangle.RenderTransform>
<RotateTransform x:Name="minuteHand" CenterX="0" CenterY="100" Angle="{Binding Path=Minute,Mode=TwoWay}" />
</Rectangle.RenderTransform>
</Rectangle>
<!-- -->
<!-- Hour -->
<Rectangle Margin="150,80,149,150" Name="rectangleHour" Stroke="LightYellow">
<Rectangle.RenderTransform>
<RotateTransform x:Name="hourHand" CenterX="0" CenterY="70" Angle="{Binding Path=Hour,Mode=TwoWay}" />
</Rectangle.RenderTransform>
</Rectangle>
<!---->
</Grid>
</Window>
。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。
后台代码:.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
public Window1()
{
InitializeComponent();
DateTime date = DateTime.Now;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
/// <summary>
/// 计算时钟转动角度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Clock cl = new Clock();
//后台线程可以请求 UI 线程代表它执行操作。
//这是通过向 UI 线程的 Dispatcher 注册工作项来完成的。
//Dispatcher 类提供两个注册工作项的方法:Invoke 和 BeginInvoke。
//这两个方法均调度一个委托来执行。Invoke 是同步调用,
//也就是说,直到 UI 线程实际执行完该委托它才返回。
//BeginInvoke 是异步的,将立即返回。
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
cl.Second = DateTime.Now.Second * 6;
cl.Minute= DateTime.Now.Minute * 6;
cl.Hour= (DateTime.Now.Hour * 30) + (DateTime.Now.Minute * 0.5);
grid.DataContext = cl;
}));
}
}
/// <summary>
/// 数据绑定类
/// </summary>
public class Clock :INotifyPropertyChanged
{
#region NotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{ //实现INotifyPropertyChanged中的PropertyChanged方法
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
#endregion
#region Property Members
private double hour = 0;
public double Hour
{
get { return hour; }
set
{
if (value != hour)
{
hour = value;
NotifyPropertyChanged("Hour");
}
}
}
private double minute = 0;
public double Minute
{
get { return minute; }
set
{
if (value != minute)
{
minute = value;
NotifyPropertyChanged("Minute");
}
}
}
private double second = 0;
public double Second
{
get { return second; }
set
{
if (value != second)
{
second = value;
NotifyPropertyChanged("Second");
}
}
}
#endregion
}
}