您的位置:首页 > 编程语言 > C#

WPF实现Tab页,使用.Resx存放文件

2015-11-26 22:02 471 查看
         我们的项目,不论是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>


写一个Resource类,用来获取resx中的资源

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,就成这效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WPF C#