WPF 模拟Windows 7 气象组件

简介:

本篇将利用Weather Reader User Control(WRUC) 模拟Windows 7 Gadgets 中的气象组件。WRUC 控件是使用C#和 WPF 制作的,首先下载WRUC 源代码,其实该控件已经实现了所有天气预报的功能,只需将DLL 库导入到其他项目使用即可。

WRUC 更新

     在使用WRUC 控件之前先了解一下它的工作模式,并完善其中的一些功能。通过源码可以看出控件是通过http://weather.service.msn.com 服务获取某地天气数据(XML格式),再将XML 读取出来用WPF 呈现给用户。下图为WRUC 默认的界面样式,可以看到控件默认是Redmond 地区的天气,虽然可以设置为其他地区,但还是希望程序运行时就是本地天气数据。同时还想在当日气温下方添加当日温度范围,并将所有温度改为摄氏度。

ori

     在WRUC 项目中可以看到Settings1.settings 配置文件,打开后里面即为Redmond 地区信息,将其修改为本地信息,这里我全部改为Beijing。

setfile

这样控件默认地区就是Beijing了,并且DegreeType 可以将温度默认调整为摄氏度。

setting

     地区和温度类型设置完成后,下面来添加当日气温范围数据,也就是获取当日最低和最高气温。在MsnWeatherDataProvider 类中当前气温信息是通过WeatherPoint 类完成的,所以先在WeatherPoint.cs 中添加最高温度和最低温度以及温度范围。

private double highTemperature;
public double HighTemperature
{
    get { return Math.Floor(highTemperature); }
    set { highTemperature = value; }
}

private double lowTemperature;
public double LowTemperature
{
    get { return Math.Floor(lowTemperature); }
    set { lowTemperature = value; }
}

public string TemperatureRangeString
{
    get { return LowTemperature.ToString() + "°- " + HighTemperature.ToString() + "°"; }
}

     回到MsnWeatherDataProvider 类,GetLatestWeatherReport 方法通过XmlTextReader 读取气象服务返回的XML 代码获得控件中所需的气温数据,那当日气温范围的数据在什么地方呢?这就需要看一看XML 代码返回的是什么内容了。

     通过浏览http://weather.service.msn.com/data.aspx?src=vista&wealocations=wc:CHXX0008 获得下面XML 代码,可见当日最低与最高气温数据就在第一个forecast 的low 和high 参数中。因为所有forecast 的数据早已被GetLatestWeatherReport 保存到WeatherReport 类的Forecast中,下面只需从Forecast 吊起就OK了。

<?xml version="1.0" ?>
<weatherdata>
    <weather weatherlocationcode="wc:CHXX0008" weatherlocationname="Beijing, CHN" 
zipcode="" encodedlocationname="Beijing%2c+CHN"
url=http://weather.msn.com/local.aspx?wealocations=wc:CHXX0008&q=Beijing%2c+CHN
imagerelativeurl="http://blst.msn.com/as/wea3/i/en-us/" degreetype="F" provider="Foreca"
attribution="Data provided by Foreca" attribution2="© Foreca"
lat="39.9125748" long="116.3889847" timezone="8" alert=""> <current temperature="86" skycode="32" skytext="Clear" date="2010-07-20" day="Tuesday"
shortday="Tue" observationtime="12:00:00" observationpoint="Beijing"
feelslike="88" humidity="52" windspeed="7" winddisplay="7 mph NNW" /> <forecast low="74" high="90" skycodeday="34" skytextday="Fair" date="2010-07-20"
day="Tuesday" shortday="Tue" precip="10" /> <forecast low="77" high="93" skycodeday="34" skytextday="Fair" date="2010-07-21"
day="Wednesday" shortday="Wed" precip="10" /> <forecast low="78" high="93" skycodeday="30" skytextday="Partly Cloudy" date="2010-07-22"
day="Thursday" shortday="Thu" precip="30" /> <forecast low="77" high="95" skycodeday="26" skytextday="Cloudy" date="2010-07-23"
day="Friday" shortday="Fri" precip="35" /> <forecast low="77" high="93" skycodeday="32" skytextday="Clear" date="2010-07-24"
day="Saturday" shortday="Sat" precip="35" /> <toolbar timewindow="60" minversion="1.0.1965.0" /> </weather> </weatherdata>

从GetLatestWeatherReport 得知forecast(预报) 数据存在result.Forecast 中。

result.Forecast.Add(forecast);

current(当日)数据存在result.LatestWeather 中。 

result.LatestWeather = current;

那么只需在result.Location = location; 前添加下面两行代码即可,因为当日forecase 是第一组数据,所以Index 应该为0。

result.LatestWeather.HighTemperature = result.Forecast[0].HighTemperature;
result.LatestWeather.LowTemperature = result.Forecast[0].LowTemperature;
result.Location = location;

最后在WeatherReaderUI.xaml 的MainGrid 中将TemperatureRangeString 显示在TextBlock 就可以了。

<TextBlock Foreground="{Binding Path=TextColor}" HorizontalAlignment="Right"
           Margin="0,64,43,0" VerticalAlignment="Top" Width="Auto" Height="Auto" 
           Text="{Binding Path=LatestWeather.TemperatureRangeString, Mode=OneWay}"
           TextWrapping="Wrap" x:Name="currentTempRangeText" 
           RenderTransformOrigin="0.5,0.5">
    <TextBlock.RenderTransform>
        <TransformGroup>
            <ScaleTransform ScaleX="1" ScaleY="1"/>
            <SkewTransform AngleX="0" AngleY="0"/>
            <RotateTransform Angle="0"/>
            <TranslateTransform X="0" Y="0"/>
        </TransformGroup>
    </TextBlock.RenderTransform>
</TextBlock>

制作WPF 程序

     重新编译WRUC 后得到新的WeatherReaderMVC.dll,有了它接下来的工作就简单了。新建项目将DLL 加入其中。在MainWindow.xaml 中加入WeatherReaderMVC 命名空间,在通过WindowStyle、Background、AllowsTransparency、ResizeMode 将WPF 设置为透明、无边框、不可修改尺寸的窗口模式。如下代码通过<w:WeatherReaderUI> 添加上面刚刚修改好的WRUC 控件,由于边框被取消所以添加<Image> 控件用来关闭应用程序。

<Window x:Class="WpfWeatherReporter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:w="clr-namespace:WeatherReaderMVC;assembly=WeatherReaderMVC"
        Title="MainWindow" Height="250" Width="300" WindowStyle="None" 
        Background="Transparent" AllowsTransparency="True" ResizeMode="NoResize" 
        Icon="/WpfWeatherReporter;component/Images/Sunny.ico" 
WindowStartupLocation="CenterScreen"> <Grid> <w:WeatherReaderUI MouseLeftButtonDown="WeatherReaderUI_MouseLeftButtonDown" /> <Image Source="/WpfWeatherReporter;component/Images/Close.png"
MouseLeftButtonDown="Image_MouseLeftButtonDown" Width="19" Height="19" Margin="253,63,7,132" ToolTip="Close" /> </Grid> </Window>

Xaml

     WeatherReaderUI_MouseLeftButtonDown 和Image_MouseLeftButtonDown 事件分别用于移动窗口和关闭窗口。

private void WeatherReaderUI_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    this.DragMove();
}

private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    this.Close();
}

至此,所有的工作已完成, 下图为程序运行后的初始和迷你界面。

real    min

查看其它地区天气情况,到了晚上太阳图标也会变化。

search

由于WRUC 使用的是Windows 7 气象组件的图像资源,所以从外观上看两者大致相同。

Compare    Mincompare 

源代码下载

WpfWeatherReporter.zip  

WeatherReader.zip





本文转自Gnie博客园博客,原文链接:http://www.cnblogs.com/gnielee/archive/2010/07/21/wpf-weater-reporter.html,如需转载请自行联系原作者

相关文章
|
IDE 开发工具 Windows
QT应用编程: windows下QT调用COM组件
QT应用编程: windows下QT调用COM组件
832 0
QT应用编程: windows下QT调用COM组件
|
25天前
|
C# 开发者 Windows
WPF在.NET9中的重大更新:Windows 11 主题
这也是一个很好的学习WPF的项目,可以通过看源代码提升自己的WPF水平。 WPF Gallery演示如何在标记中指定 XAML 控件,因为每个控件页都显示用于创建每个示例的标记。它还将显示您的应用程序的所有可能的布局选项。 WPF Gallery应用还包含有关使用颜色、排版和图标开发特殊应用程序的设计指南。它还包括一个示例页,用于演示如何使用不同的控件在 WPF 应用程序中创建用户界面。 WPF在.NET 9中可以使用Win11主题的控件了,有助于WPF开发者们开发出更符合现在设计风格、更美观的界面。 希望WPF越来越好。
26 0
|
2月前
|
Windows
Windows系统下安装分布式事务组件Seata
Windows系统下安装分布式事务组件Seata
110 0
|
2月前
|
Windows Python
python操作windows组件
python操作windows组件
35 0
|
2月前
|
人工智能 机器人 C#
Windows编程课设(C#)——基于WPF和.net的即时通讯系统(仿微信)
一款参考QQ、微信的即时通讯软件。采用CS结构,客户端基于.Net与WPF开发,服务端使用Java开发。
|
NoSQL Redis 数据安全/隐私保护
.net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
Cygwin工具编译Redis Redis6.x版本是未编译版本(官方很调皮,所以没办法,咱只好帮他们编译一下了),所以咱们先下载一个Cygwin,用它来对Redis进行编译。
220 0
.net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
|
编解码 计算机视觉 Windows
Qt实用技巧:使用QMediaPlayer和Windows自带组件播放swf、rmvb、mpg、mp4等视频文件
Qt实用技巧:使用QMediaPlayer和Windows自带组件播放swf、rmvb、mpg、mp4等视频文件
Qt实用技巧:使用QMediaPlayer和Windows自带组件播放swf、rmvb、mpg、mp4等视频文件
Win7/Windows2003下IIS6.0、IIS7.5的伪静态组件安装和伪静态配置方法
Win7/Windows2003下IIS6.0、IIS7.5的伪静态组件安装和伪静态配置方法,还包括常用的伪静态规则使用方法
126 0
Win7/Windows2003下IIS6.0、IIS7.5的伪静态组件安装和伪静态配置方法
|
C++ Windows
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(二)
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(二)
209 0
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(二)
|
C++ Windows
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(一)
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(一)
400 0
【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )(一)