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

         我们的项目,不论是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,就成这效果了。



你可能感兴趣的:(C#,WPF)