我们的项目,不论是C/S还是B/S总会用到Tab标签的,实现我们的切换效果。最近一直做WPF的项目,其实他们的用法都是大同小异的。
那么,.Resx存放文件又是怎么存放呢,一般会存放什么样的文件呢?这样有什么好处呢?
原因很简单,容我一一道来。
.Resx文件,属于资源文件。我们可以将公有资源文件中的图片,Text文本等资源存放至此,供我们调用。熟知.net的程序员对他一定不陌生。.resx 资源文件格式由 XML 项组成,这些 XML 项指定 XML 标记内的对象和字符串
目前在做一个服务器设备、数据库设备、传感器设备等的监测系统,他们的状态显示用Tab以列表的形式显示出来,当然设备发生异常也会有相应的异常处理,异常信息我则以.Resx的形式存储,对于可变的值则以不同的方式传值。
我就边总结边敲了一个大同小异的小demo,其中这个错误异常信息,设备名称我们可以直接读库,对于这个异常信息我们就可以在.resx文件中配置了。
其中,这个{0}、{1}都传入的都是可变的值,如:当前{数据库A}设备发生异常,已自动连接到:{B应急库}
下面我们来设计我们的Tab界面:
<Window x:Class="TabDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TableText" Height="350" Width="525"> <Grid> <TabControl x:Name="tbcDeviceInfo" Grid.Row="1"> <TabItem x:Name="DeviceMonitorInfo" Header="设备监测信息"> <DataGrid Grid.Row="1" HeadersVisibility="Column" Name="gridStudentsInfo" Margin="0,5,0,0" MinColumnWidth="55" ItemsSource="{Binding}" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False" Grid.ColumnSpan="2"> <DataGrid.Columns> <DataGridTextColumn Width="20*" Header="设备名称" Binding="{Binding S_StudentName}"/> <DataGridTextColumn Width="20*" Header="设备类型" Binding="{Binding S_StudentSex}"/> <DataGridTextColumn Width="20*" Header="报警级别" Binding="{Binding S_StudentNumber}"/> <DataGridTextColumn Width="22*" Header="CPU占用率" Binding="{Binding S_College}"/> <DataGridTextColumn Width="20*" Header="内存占用率" Binding="{Binding S_Magor}"/> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem x:Name="ExceptionInfo" Header="错误异常信息"> <DataGrid Grid.Row="1" HeadersVisibility="Column" Name="gridExceptionInfo" Margin="0,5,0,0" MinColumnWidth="55" ItemsSource="{Binding}" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False" Grid.ColumnSpan="2"> <DataGrid.Columns> <DataGridTextColumn Width="20*" Header="设备名称" Binding="{Binding S_DEVICENAME}"/> <DataGridTextColumn Width="20*" Header="异常信息" Binding="{Binding S_ExceptionInfo}"/> <DataGridTextColumn Width="15*" Header="报警发生时间" Binding="{Binding D_CREATETIME,StringFormat='yyyy年MM月dd日 HH:mm:ss'}"/> </DataGrid.Columns> </DataGrid> </TabItem> </TabControl> </Grid> </Window>
public sealed class Resource { #region Static part /// <summary> ///获取Resx文件的文件名 /// </summary> private const string ResourceFileName = ".ResourceText"; static Resource InternalResource = new Resource(); /// <summary> /// Gets a resource manager for the assembly resource file /// </summary> public static Resource Manager { get { return InternalResource; } } #endregion #region Instance part ResourceManager rm = null; /// <summary> /// Constructor /// 取得资源文件 /// </summary> public Resource() { rm = new ResourceManager(this.GetType().Namespace + ResourceFileName, Assembly.GetExecutingAssembly()); } /// <summary> /// Gets the message with the specified key from the assembly resource file /// </summary> public string this[string key] { get { return rm.GetString(key, System.Globalization.CultureInfo.CurrentUICulture); } } #endregion }
public partial class MainWindow : Window { //定义从数据库时时刷新数据的计时器 System.Timers.Timer timerRefresh = new System.Timers.Timer(); public MainWindow() { InitializeComponent(); //设置定时器参数 timerRefresh.Enabled = true; timerRefresh.Elapsed += new ElapsedEventHandler(RefreshData); timerRefresh.Interval = 10000; //1秒 } //定时从数据库刷新数据 private void RefreshData(object sender, System.Timers.ElapsedEventArgs e) { DataTable dtExceptionInfo = new DataTable(); dtExceptionInfo.TableName = "exceptionInfo"; dtExceptionInfo.Columns.Add("S_DEVICENAME", System.Type.GetType("System.String")); dtExceptionInfo.Columns.Add("S_ExceptionInfo", System.Type.GetType("System.String")); dtExceptionInfo.Columns.Add("D_CREATETIME", System.Type.GetType("System.String")); try { this.Dispatcher.Invoke(new Action(delegate { //获取设备信息 //此处代码省略,获取的信息可以直接读库,也可以从内存中获取。 //将设备信息在界面中显示出数据来 //这里假设{0}传过来的值为“数据库A”,{1}传过来的值为“B应急库” string strDBAName = "数据库A"; string strDBBName="B应急库"; //获取resx文件中错误信息的配置值 string strExceptionInfo = Resource.Manager["ExceptionInfoError"].ToString().Trim(); DataRow dr = dtExceptionInfo.NewRow(); dr["S_DEVICENAME"] = strDBAName.ToString(); dr["S_ExceptionInfo"] = string.Format(strExceptionInfo, strDBAName.ToString(), strDBBName.ToString() + "应急库"); dr["D_CREATETIME"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); dtExceptionInfo.Rows.Add(dr); //绑定数据源 gridExceptionInfo.ItemsSource = dtExceptionInfo.DefaultView; })); } catch (Exception ex) { //错误日志 } } }
因为用了定时器,所以列表里的异常信息过了一会才显示出来。一看代码就会明白的。
图片效果质量很差,临时和二华子学了个截图工具,但是文件太大,所以只能降低图片质量,将14M的图片压缩为1.6M,就成这效果了。