东营机关建设网站,上传户型图生成效果图,怎么制作简历电子版,大连建设工程项目管理信息网现代桌面UI框架科普及WPF入门 文章目录 现代桌面UI框架科普及WPF入门桌面应用程序框架介绍过时的UI框架MFC (Microsoft Foundation Class)缺点 经典的UI框架**WinForms****QT****WPF** 未来的UI框架**MAUI****AvaloniaUI** WPF相对于Winform#xff0c;QT#xff0c;MFC的独立…现代桌面UI框架科普及WPF入门 文章目录 现代桌面UI框架科普及WPF入门桌面应用程序框架介绍过时的UI框架MFC (Microsoft Foundation Class)缺点 经典的UI框架**WinForms****QT****WPF** 未来的UI框架**MAUI****AvaloniaUI** WPF相对于WinformQTMFC的独立优势WPF的基本概念WPF 编程模型XAML依赖项和附加属性 实操创建项目关键字说明尝试添加控件尝试添加响应事件 数据绑定模板丰富的开源UI库支持 桌面应用程序框架介绍
过时的UI框架
MFC 语言C
MFC (Microsoft Foundation Class)
以C类的形式封装了Windows API并且包含一个应用程序框架。类中包含了大量的windows句柄封装类和很多windows的组件和内建控件的封装类。MFC把Windows SDK API函数包装成了几百个类MFC给Windows系统提供面向对象的接口。
缺点
技术老化MFC是一个非常老的框架最早发布于1992年。随着时间的推移新的技术和框架不断涌现MFC显得过时开发效率低相比于现代的开发框架MFC的开发效率较低。它基于C需要编写大量的代码来实现一些基本功能而现代框架如WPF和WinForms则提供了更高层次的抽象和更丰富的控件库
经典的UI框架
WinForms
语言C# WinForms (Windows Forms) 微软在2001年随NET Framework和Visual Studio首次发布的图形用户界面GUI类库。它的设计初衷是简化Windows桌面应用程序的开发使企业开发者无需精通C也能创建数据驱动的业务应用²。
主要特点
易用性WinForms提供了大量的控件和事件处理机制简化了用户界面开发。
缺点 技术老化WinForms最早发布于2001年虽然在当时是一个非常先进的技术但随着时间的推移新的技术和框架不断涌现WinForms显得过时 功能限制相比于现代的框架如WPF和UWPWinForms在功能和灵活性上存在一定的限制。例如WinForms在处理复杂的UI和动画效果时显得力不从心 跨平台支持不足WinForms主要用于Windows平台而现代应用程序往往需要跨平台支持。虽然通过Mono项目可以在其他操作系统上运行WinForms但其跨平台能力仍然有限
QT
语言C Qt最早由挪威的两位程序员Eirik Chambe-Eng和Haavard Nord于1991年开发。Qt的第一个公众预览版于1995年发布。
应用领域 Qt作为一个跨平台的C应用程序开发框架广泛应用于以下领域
桌面应用支持Windows、macOS和Linux等操作系统适合开发复杂的桌面应用程序。移动应用支持Android和iOS适合开发高性能的移动应用。嵌入式系统在汽车、医疗设备和工业控制等领域有广泛应用。物联网在智能家居、智能制造等物联网领域崭露头角。
WPF
语言C# Windows Presentation Foundation (WPF) 是由微软开发的用户界面框架最早发布于2006年作为 .NET Framework 3.0 的一部分。WPF 的设计初衷是提供一个现代化的、基于矢量图形的渲染引擎能够充分利用现代图形硬件的加速能力。2018年微软将WPF开源并在GitHub上发布采用MIT许可证。
应用领域 WPF广泛应用于各种Windows桌面应用程序的开发以下是一些主要的应用领域
企业级应用WPF在企业级应用开发中非常流行特别是需要复杂用户界面和数据绑定的应用。多媒体应用由于其强大的图形和动画支持WPF适合开发多媒体应用如视频播放器和图形编辑器。数据可视化WPF的矢量图形和数据绑定功能使其非常适合用于数据可视化和仪表盘应用。教育和培训软件WPF的动画和多媒体功能使其成为开发教育和培训软件的理想选择。
WPF的强大功能和灵活性使其成为开发现代化Windows应用程序的首选框架之一。
未来的UI框架
MAUI
语言C# MAUI (Multi-platform App UI)
功能支持iOS、Android、macOS和Windows平台使用单一代码库构建原生用户界面特点利用每个平台的原生UI工具包确保应用在各平台上都有原生的外观和感觉
AvaloniaUI
语言C#
功能支持Windows、macOS、Linux、WebAssembly等平台使用XAML进行界面设计特点使用Skia图形引擎进行自定义渲染提供一致的跨平台用户界面
WPF相对于WinformQTMFC的独立优势
XAMLXAML 是 WPF 的标记语言它是一种基于 XML 的标记语言用于定义应用程序的用户界面。XAML 允许开发人员以声明方式创建 UI 元素并使用数据绑定、命令、样式和模板等特性来实现动态 UI。依赖项和附加属性依赖项属性是 WPF 的一种属性系统它允许控件和其他元素通过属性来进行通信并提供一种简单、一致的属性系统。样式和模板样式和模板是 WPF 的可视化机制它们允许开发人员创建一致的外观和感觉。样式可以应用到控件、应用程序、窗口或整个应用程序的范围内而模板可以应用到控件的各个部分。命令命令是 WPF 的交互模型它允许开发人员创建可重用的交互逻辑并与控件、路由事件和数据绑定相结合。
WPF的基本概念
Windows Presentation Foundation (WPF) 是微软开发的一种用于构建 Windows 桌面应用程序的框架。它提供了丰富的图形功能、数据绑定和自定义控件等特性。以下是 WPF 的一些基本概念
矢量图形引擎WPF 的核心是一个与分辨率无关且基于矢量的呈现引擎旨在充分利用现代图形硬件。XAML可扩展应用程序标记语言 (XAML) 是一种基于 XML 的标记语言用于定义应用程序的用户界面。XAML 允许开发人员以声明方式创建 UI 元素。数据绑定WPF 提供了强大的数据绑定功能可以轻松地将 UI 元素与数据源连接起来实现数据的动态更新。控件WPF 包含一套丰富的控件库如按钮、文本框、列表框等开发人员可以使用这些控件构建复杂的用户界面。布局WPF 提供了多种布局容器如 Grid、StackPanel 和 Canvas帮助开发人员灵活地安排 UI 元素的位置和大小。动画和图形WPF 支持二维和三维图形以及动画效果使得应用程序的界面更加生动。
WPF 编程模型
WPF 编程模型包含以下主要组件
应用程序对象应用程序对象是 WPF 应用程序的入口点它负责创建应用程序的主窗口、资源、路由事件和其他应用程序级的设置。窗口对象窗口对象是 WPF 应用程序的主要 UI 容器它包含应用程序的主要 UI 元素如菜单、工具栏、状态栏、标题栏、内容区域等。控件控件是 WPF 应用程序的主要 UI 元素它们提供丰富的功能和可视化效果如按钮、文本框、列表框、菜单、对话框等。资源资源是 WPF 应用程序的外部数据如颜色、字体、图片、样式、数据模板等。路由事件路由事件是 WPF 应用程序的事件模型它允许控件和应用程序对象之间进行通信并提供一种简单、一致的事件处理机制。数据绑定数据绑定是 WPF 应用程序的核心功能它允许开发人员将 UI 元素与数据源绑定起来实现数据的动态更新。样式和模板样式和模板是 WPF 应用程序的可视化机制它们允许开发人员创建一致的外观和感觉。命令命令是 WPF 应用程序的交互模型它允许开发人员创建可重用的交互逻辑并与控件、路由事件和数据绑定相结合。
XAML
语法xml
Windowx:ClassWpfApp1.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:localclr-namespace:WpfApp1xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006TitleMainWindowWidth800Height450WindowStartupLocationCenterScreenmc:IgnorabledGridButton ContentClick Me //Grid
/Window依赖项和附加属性
依赖属性
为什么要有依赖属性 The main difference is, that the value of a normal .NET property is read directly from a private member in your class, whereas the value of a DependencyProperty is resolved dynamically when calling the GetValue() method that is inherited from DependencyObject.
When you set a value of a dependency property it is not stored in a field of your object, but in a dictionary of keys and values provided by the base class DependencyObject. The key of an entry is the name of the property and the value is the value you want to set.
The advantages of dependency properties are
Reduced memory footprint: It’s a huge dissipation to store a field for each property when you think that over 90% of the properties of a UI control typically stay at its initial values. Dependency properties solve these problems by only store modified properties in the instance. The default values are stored once within the dependency property. Value inheritance: When you access a dependency property the value is resolved by using a value resolution strategy. If no local value is set, the dependency property navigates up the logical tree until it finds a value. When you set the FontSize on the root element it applies to all textblocks below except you override the value. Change notification: Dependency properties have a built-in change notification mechanism. By registering a callback in the property metadata you get notified, when the value of the property has been changed. This is also used by the databinding. check the below url for more details about the magic behid it
大意依赖属性是一种特殊的属性它的值是动态计算的而不是直接存储在对象实例的字段中。依赖属性的值存储在依赖对象基类 DependencyObject 提供的字典中字典的键是属性的名称值是要设置的值。依赖属性的优点有
内存占用减少依赖属性仅存储修改过的值而不是每个属性都存储一个字段。默认值只存储一次而不是每个实例都存储。值继承当访问依赖属性时值是根据值解析策略进行计算的。如果没有本地值则依赖属性沿着逻辑树向上搜索直到找到值。当在根元素上设置 FontSize 时它将应用于所有文本块除非您覆盖值。通知更改依赖属性具有内置的更改通知机制。通过在属性元数据中注册回调可以获得有关属性值更改的通知。这也用于数据绑定。
具体参考stackoverflow
主要作用
可以在代码或 XAML 中设置属性。
Button ContentI am red BackgroundRed/或者设置复杂的属性值
Button ContentI have an image backgroundButton.BackgroundImageBrush ImageSourcestripes.jpg//Button.Background
/Button在代码中设置
Button myButton new();
myButton.Width 200.0;设置资源
StackPanel.ResourcesSolidColorBrush x:KeyMyBrush ColorGold/
/StackPanel.Resources绑定数据
Button Content{Binding text}/4.绑定样式
Style x:KeyGreenButtonStyleSetter PropertyControl.Background ValueGreen/
/Style使用
Button Style{StaticResource GreenButtonStyle} ContentI am green/附加属性 附加属性是一个 Extensible Application Markup Language (XAML) 概念。 附加属性允许为派生自 DependencyObject 的任何 XAML 元素设置额外的属性/值对即使该元素未在其对象模型中定义这些额外的属性。 额外的属性可进行全局访问。 附加属性通常定义为没有常规属性包装器的依赖属性的专用形式。
附加属性允许子元素为父元素中定义的属性指定唯一值。 一个常见方案是一个子元素指定它应如何被其父元素呈现在 UI 中。 例如DockPanel.Dock 是一个附加属性因为它在 DockPanel 的子元素上设置而不是在 DockPanel 本身设置。 DockPanel 类定义名为 DockProperty 的静态 DependencyProperty 字段然后提供 GetDock 和 SetDock 方法作为附加属性的公共访问器。
DockPanelTextBox DockPanel.DockTopEnter text/TextBox
/DockPanel实操
创建项目
关于Net Framework和Net Core、Net
[详情](.NET Standard - .NET | Microsoft Learn)
运行平台语言版本支持平台著名框架WindowsC# 7.3.NET FrameworkWPFWinFormsASP.NETWindowsmacOSLinuxC# 8.NET CoreWPFWinFormsASP.NET CoreWindowsmacOSLinuxC# 9.NET 56789WPFWinFormsMAUIUno PlatformAvalonia UI, ASP.Net Core MainWindow.xaml:
Windowx:ClassWpfApp1.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:localclr-namespace:WpfApp1xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006TitleMainWindowWidth800Height450WindowStartupLocationCenterScreenmc:IgnorabledGrid/Grid
/Window作用前端文件定义了窗口的基本结构包括窗口的大小、位置、标题、背景色等。
MainWindow.xaml.cs:
namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}}
}作用后端文件定义了窗口的行为包括按钮的点击事件、文本框的输入事件等。
App.xaml:
Applicationx:ClassWpfApp1.Appxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:localclr-namespace:WpfApp1 StartupUriMainWindow.xamlApplication.Resources/Application.Resources
/Application作用定义了应用程序的基本结构包括资源、主题等。
App.xaml.cs:
namespace WpfApp1
{public partial class App : Application{}
}作用定义了应用程序的行为包括启动事件等。
关键字说明
xmlnsXML 命名空间用于定义 XML 文档中的元素、属性和指令。 xmlns:xXAML 命名空间用于定义 XAML 文档中的元素、属性和指令。 xmlns:dBlend 命名空间用于定义 Blend 文档中的元素、属性和指令。 xmlns:local本地命名空间用于定义当前文档中的元素、属性和指令。 xmlns:mc标记兼容性命名空间用于定义标记兼容性文档中的元素、属性和指令。 x:ClassXAML 类用于指定当前 XAML 文件的类。 mc:Ignorable标记兼容性忽略用于指定标记兼容性文档中可以忽略的元素。
尝试添加控件
Grid Margin5Grid.RowDefinitionsRowDefinition Heightauto /RowDefinition Heightauto /RowDefinition Heightauto //Grid.RowDefinitionsGrid Margin5Grid.ColumnDefinitionsColumnDefinition Width.3* /ColumnDefinition Width.7* //Grid.ColumnDefinitionsTextBlock VerticalAlignmentCenter TextUserName TextAlignmentRight /TextBox Grid.Column1 Margin25,0,0,0 //GridGrid Grid.Row1 Margin5Grid.ColumnDefinitionsColumnDefinition Width.3* /ColumnDefinition Width.7* //Grid.ColumnDefinitionsTextBlock VerticalAlignmentCenter TextPassword TextAlignmentRight /TextBox Grid.Column1 Margin25,0,0,0 //GridButton Grid.Row2 Margin5,10 ContentLogin /
/Grid尝试添加响应事件
为了实现登录功能我们需要在按钮的 Click 事件中编写代码。
前台代码
Grid Margin5Grid.RowDefinitionsRowDefinition Heightauto /RowDefinition Heightauto /RowDefinition Heightauto //Grid.RowDefinitionsGrid Margin5Grid.ColumnDefinitionsColumnDefinition Width.3* /ColumnDefinition Width.7* //Grid.ColumnDefinitionsTextBlock VerticalAlignmentCenter TextUserName TextAlignmentRight /TextBox x:NameTextBoxUserName Grid.Column1 Margin25,0,0,0 //GridGrid Grid.Row1 Margin5Grid.ColumnDefinitionsColumnDefinition Width.3* /ColumnDefinition Width.7* //Grid.ColumnDefinitionsTextBlock VerticalAlignmentCenter TextPassword TextAlignmentRight /TextBox x:NameTextBoxPassword Grid.Column1 Margin25,0,0,0 //GridButtonx:NameButtonLoginGrid.Row2Margin5,10ClickButtonLogin_ClickContentLogin /
/Grid后台代码
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void ButtonLogin_Click(object sender, RoutedEventArgs e){var username TextBoxUserName.Text;var password TextBoxPassword.Text;if (username admin password password){MessageBox.Show(Login successful!);}else{MessageBox.Show(Invalid username or password!);}}
}数据绑定
数据绑定是 WPF 应用程序的重要特性之一它允许开发人员在 UI 元素和数据源之间建立双向绑定。
为什么要数据绑定
请问在Winform或者QT中如何实现以下效果? 假设存在MinValueMaxValue两个值分别代表最小值和最大值现在需要实现2个滑动条以及2个输入框分别对应2个值并且当最小值超过最大值时可以自动调整最大值反之亦然。 如果在此基础上再加上MinRange和MaxRange的设置不使用现代UI框架的阁下又该如何是好 使用WPF后我们只需要关心业务而不用像Winform或者QT一样频繁关注控件的ValueChanged事件以及各个事件的互锁
StackPanel OrientationVerticalmaterialDesign:NumericUpDown Margin5 Maximum{Binding MaxRange} Minimum{Binding MinRange} Value{Binding MinValue, ModeTwoWay} /Slider Margin5 Maximum{Binding MaxRange} Minimum{Binding MinRange} Value{Binding MinValue, ModeTwoWay} /materialDesign:NumericUpDown Margin5 Maximum{Binding MaxRange} Minimum{Binding MinRange} Value{Binding MaxValue, ModeTwoWay} /Slider Margin5 Maximum{Binding MaxRange} Minimum{Binding MinRange} Value{Binding MaxValue, ModeTwoWay} /Separator Margin5 /TextBlock Margin5,5 Text最小值设置 /materialDesign:NumericUpDown Margin5,0 Maximum9999 Minimum-9999 Value{Binding MinRange} /TextBlock Margin5,0 Text最大值设置 /materialDesign:NumericUpDown Margin5,0 Maximum9999 Minimum-9999 Value{Binding MaxRange} /
/StackPanelpublic partial class MainWindow : Window, INotifyPropertyChanged
{public event PropertyChangedEventHandler? PropertyChanged;public MainWindow(){InitializeComponent();this.DataContext this;}private int minValue 50;public int MinValue{get { return minValue; }set{minValue value;RaisePropertyChanged();if (value maxValue)MaxValue value;}}private int maxValue 128;public int MaxValue{get maxValue;set{maxValue value;RaisePropertyChanged();if (value minValue)MinValue value;}}private int maxRange 255;public int MaxRange{get maxRange;set{maxRange value;RaisePropertyChanged();if (MaxValue value)MaxValue value;}}private int minRange 0;public int MinRange{get minRange;set{minRange value;RaisePropertyChanged();if (MinValue value)MinValue value;}}void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName ) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}模板
DataTemplate:用于定义数据的显示方式。
如何使用Winform实现以下表格 复杂程度不在赘述 public ListStudent Students { get; set; } new();public class Student
{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }public bool IsMale { get; set; }
}前端部分
DataGrid ItemsSource{Binding Students} /甚至是自动适配枚举
public enum EClassType
{kindergarten,Elementary,Junior,Senior,University
} 如果使用了第三方库 丰富的开源UI库支持 文章转载自: http://www.morning.qkwxp.cn.gov.cn.qkwxp.cn http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn http://www.morning.rkdw.cn.gov.cn.rkdw.cn http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn http://www.morning.fbqr.cn.gov.cn.fbqr.cn http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.lfttb.cn.gov.cn.lfttb.cn http://www.morning.abgy8.com.gov.cn.abgy8.com http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.dfdhx.cn.gov.cn.dfdhx.cn http://www.morning.lssfd.cn.gov.cn.lssfd.cn http://www.morning.wlsrd.cn.gov.cn.wlsrd.cn http://www.morning.rkgyx.cn.gov.cn.rkgyx.cn http://www.morning.nshhf.cn.gov.cn.nshhf.cn http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.tsrg.cn.gov.cn.tsrg.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.qrsm.cn.gov.cn.qrsm.cn http://www.morning.jikuxy.com.gov.cn.jikuxy.com http://www.morning.tnhmp.cn.gov.cn.tnhmp.cn http://www.morning.frnjm.cn.gov.cn.frnjm.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.zkbxx.cn.gov.cn.zkbxx.cn http://www.morning.qsmmq.cn.gov.cn.qsmmq.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.rxpp.cn.gov.cn.rxpp.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.hmqmm.cn.gov.cn.hmqmm.cn http://www.morning.tfsyk.cn.gov.cn.tfsyk.cn http://www.morning.fplqh.cn.gov.cn.fplqh.cn http://www.morning.sdhmn.cn.gov.cn.sdhmn.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.dspqc.cn.gov.cn.dspqc.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.bcngs.cn.gov.cn.bcngs.cn http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn http://www.morning.jsrnf.cn.gov.cn.jsrnf.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.syznh.cn.gov.cn.syznh.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.drnjn.cn.gov.cn.drnjn.cn http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn http://www.morning.cknrs.cn.gov.cn.cknrs.cn http://www.morning.srndk.cn.gov.cn.srndk.cn http://www.morning.kjlia.com.gov.cn.kjlia.com http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.ncfky.cn.gov.cn.ncfky.cn http://www.morning.srmpc.cn.gov.cn.srmpc.cn http://www.morning.hrydl.cn.gov.cn.hrydl.cn http://www.morning.snbq.cn.gov.cn.snbq.cn http://www.morning.fbqr.cn.gov.cn.fbqr.cn http://www.morning.nkjkh.cn.gov.cn.nkjkh.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.rrxmm.cn.gov.cn.rrxmm.cn http://www.morning.rfldz.cn.gov.cn.rfldz.cn http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.cywf.cn.gov.cn.cywf.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.dansj.com.gov.cn.dansj.com http://www.morning.smqjl.cn.gov.cn.smqjl.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.cjrmf.cn.gov.cn.cjrmf.cn http://www.morning.ykswq.cn.gov.cn.ykswq.cn http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn http://www.morning.hkpn.cn.gov.cn.hkpn.cn http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn http://www.morning.rcmwl.cn.gov.cn.rcmwl.cn http://www.morning.rbjth.cn.gov.cn.rbjth.cn http://www.morning.qnxzx.cn.gov.cn.qnxzx.cn http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn