• 定时任务 Wpf.Quartz.Demo.2


    定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面。

    准备工作:

    1.界面选择MahApp.Metro

    在App.xaml添加资源

     <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
                    <ResourceDictionary>
                        <System:Double x:Key="WindowTitleFontSize">12</System:Double>
                        <System:Double x:Key="NormalFontSize">12</System:Double>
                        <System:Double x:Key="ContentFontSize">12</System:Double>
                        <System:Double x:Key="FlatButtonFontSize">12</System:Double>
                        <System:Double x:Key="MenuFontSize">12</System:Double>
                        <System:Double x:Key="ContextMenuFontSize">12</System:Double>
                        <System:Double x:Key="StatusBarFontSize">12</System:Double>
                        <System:Double x:Key="ToggleSwitchFontSize">12</System:Double>
                        <System:Double x:Key="ToggleSwitchHeaderFontSize">12</System:Double>
                        <System:Double x:Key="UpperCaseContentFontSize">12</System:Double>
                        <System:Double x:Key="TabItemFontSize">12</System:Double>
                    </ResourceDictionary>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    App.xaml

    其中   <System:Double x:Key="WindowTitleFontSize">12</System:Double> ...为改变整个app的相关字体大小。

    2.添加log4net记录异常

    安装log4net。

    在App.config内配置log4net

    <log4net>
        <!--按日期分割日志文件 一天一个-->
        <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
          <!--是否续写-->
          <param name="AppendToFile" value="true" />
          <!--最小锁定模型以允许多个进程可以写入同一个文件-->
          <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
          <param name="StaticLogFileName" value="true" />
          <!--保存路径-->
          <param name="File" value="Log" />
          <param name="DatePattern" value="yyyy-MM-dd.LOG" />
          <param name="StaticLogFileName" value="false" />
          <param name="RollingStyle" value="Date" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%n-----------------------------------------%n时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
          </layout>
        </appender>
        <root>
          <!--文件形式记录日志-->
          <appender-ref ref="LogFileAppenderByDate" />
        </root>
      </log4net>
    App.config

    在App.xaml.cs内添加

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows;
    
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    namespace Wpf.Quartz
    {
        /// <summary>
        /// App.xaml 的交互逻辑
        /// </summary>
        public partial class App : Application
        {
            public App()
            {
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                Application.Current.DispatcherUnhandledException += Application_DispatcherUnhandledException;
            }
    
            private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
            private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
            {
                //记录严重错误 
                log.Fatal(e.Exception);
                e.Handled = true;//使用这一行代码告诉运行时,该异常被处理了,不再作为UnhandledException抛出了。            
            }
    
            void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                //记录严重错误                  
                log.Fatal(e.ExceptionObject);
            }
        }
    }
    App.xaml.cs

    其中  AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
             Application.Current.DispatcherUnhandledException += Application_DispatcherUnhandledException;  捕获没有处理的异常,避免程序崩溃。

    3.使用MVVM模式,这里不使用mvvmlight,prism等框架,这里写个简单的类ViewModel继承它即可。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Wpf.Quartz.Helper
    {
        public class BaseViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }
    BaseViewModel

    4.前台主界面

    <Controls:MetroWindow x:Class="MyWpf.Quart.Demo.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
            mc:Ignorable="d"
            Title="QuartzDemo" Height="600" Width="800" WindowStartupLocation="CenterScreen" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="100"></RowDefinition>
            </Grid.RowDefinitions>
            <Menu Background = "{DynamicResource AccentColorBrush}">
                <MenuItem Header="系统菜单" Background="Transparent">
                    <MenuItem Header="全部开始" Command="{Binding MeunCommand}" CommandParameter="StartAll"/>
                    <MenuItem Header="全部停止" Command="{Binding MeunCommand}" CommandParameter="StopAll"/>
                </MenuItem>
            </Menu>
            <DataGrid Grid.Row="1" x:Name="table" AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding TaskRuns}" SelectedItem="{Binding SelectedRun}" ColumnWidth="Auto">
                <DataGrid.ContextMenu>
                    <ContextMenu >
                        <MenuItem Header="启动" Command="{Binding JobStartCommand}" 
                                  CommandParameter="{Binding SelectedRun}" 
                               />
                        <MenuItem Header="停止" Command="{Binding JobStopCommand}" 
                                  CommandParameter="{Binding SelectedRun}" 
                                 />
                        <MenuItem Header="重新启动" Command="{Binding JobReStartCommand}" 
                                  CommandParameter="{Binding SelectedRun}" 
                                 />
                        <MenuItem Header="暂停" Command="{Binding JobPauseCommand}"
                                  CommandParameter="{Binding SelectedRun}" 
                                  />
                        <MenuItem Header="恢复" Command="{Binding JobResumeCommand}"
                                  CommandParameter="{Binding SelectedRun}" 
                                 />
                        <MenuItem Header="手动执行一次" Command="{Binding JobRunCommand}" 
                                  CommandParameter="{Binding SelectedRun}" 
                                  />
                    </ContextMenu>
                </DataGrid.ContextMenu>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="编辑" IsReadOnly="True" Binding="{Binding IsEdit}"></DataGridTextColumn>
                    <DataGridTextColumn Header="名称" IsReadOnly="True" Binding="{Binding DisplayName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="标识符" IsReadOnly="True" Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="状态">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock   VerticalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="描述" IsReadOnly="True" Binding="{Binding Remark}"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="执行设置"  Width="*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock x:Name="txt" ToolTip="点击设置" VerticalAlignment="Center">                                  
                                        <Hyperlink Command="{Binding DataContext.JobSetCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                                            CommandParameter="{Binding }">设置 </Hyperlink>
                                        <Run Text="{Binding SettingStr}"></Run>
                                    </TextBlock>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="开始时间" IsReadOnly="True" Binding="{Binding StartTime,StringFormat=yyyy-MM-dd HH:mm:ss}"></DataGridTextColumn>
                    <DataGridTextColumn Header="结束时间" IsReadOnly="True" Binding="{Binding EndTime,StringFormat=yyyy-MM-dd HH:mm:ss}"></DataGridTextColumn>
                    <DataGridTextColumn Header="下次执行时间" IsReadOnly="True" Binding="{Binding NextRunTime,StringFormat=yyyy-MM-dd HH:mm:ss}"></DataGridTextColumn>
                    <DataGridTemplateColumn Header="详情">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock x:Name="txt" ToolTip="点击打开" VerticalAlignment="Center">                                  
                                        <Hyperlink Command="{Binding DataContext.JobDetailCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                                            CommandParameter="{Binding }">详情</Hyperlink>
                                    </TextBlock>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <GridSplitter x:Name="gsSplitterr" Grid.Row="2" Height="3" Background="{DynamicResource AccentColorBrush}" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
            <RichTextBox x:Name="rtb" Grid.Row="3" IsReadOnly="True" VerticalScrollBarVisibility="Auto">
                <RichTextBox.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="剪贴" Command="ApplicationCommands.Cut"/>                     
                        <MenuItem Header="复制" Command="ApplicationCommands.Copy"/>                                         
                        <MenuItem Header="粘贴" Command="ApplicationCommands.Paste"/>                                          
                    </ContextMenu>
                </RichTextBox.ContextMenu>
                <RichTextBox.Resources>
                    <Style TargetType="{x:Type Paragraph}">
                        <Setter Property="Margin" Value="0"/>
                        <Setter Property="LineHeight" Value="20"/>
                    </Style>
                </RichTextBox.Resources>
            </RichTextBox>
        </Grid>
    </Controls:MetroWindow>
    MainWindow

    好的,至此准备工作已经完成。预计还有两节全部完成。

    代码下载:https://pan.baidu.com/s/1Ri_yangO0N0sfC-KyZVwbw

    作者:竹天笑
    互相学习,提高自己。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    TypeError: Buffer.alloc is not a function
    node.js服务端程序在Linux上持久运行
    C#中的反射
    群要事日记
    vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。
    VP9 Video Codec
    用户手册是Yasm汇编
    更改Mysql数据库存储位置
    注册表项
    C#开发可以可视化操作的windows服务
  • 原文地址:https://www.cnblogs.com/akwkevin/p/10416335.html
Copyright © 2020-2023  润新知