/// <summary>
        /// 取消事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnCancel_Click(object sender, RoutedEventArgs e)
        {
            DataGridTemplateColumn column  = this.grdList.Columns[0] as DataGridTemplateColumn;
            FrameworkElement       element = column.GetCellContent(this.grdList.Items[this.grdList.SelectedIndex]);
            var    bar         = column.CellTemplate.FindName("progressCtl", element) as ProgressBar;
            var    btnCancel   = sender as Button;
            Button btnDownload = column.CellTemplate.FindName("btnDownload", element) as Button;
            var    lblCancel   = column.CellTemplate.FindName("lblCancel", element) as Label;

            var index = this.grdList.SelectedIndex;

            Task.Factory.StartNew(() =>
            {
                this.Dispatcher.Invoke(new Action(() =>
                {
                    btnCancel.Visibility = Visibility.Hidden;
                    lblCancel.Visibility = Visibility.Visible;
                    bar.Visibility       = Visibility.Hidden;
                }));

                if (DicMap.Keys.Contains(index))
                {
                    Thread td = DicMap[index];
                    DicMap.Remove(index);
                    DicIsStop[index] = true;
                    Thread.Sleep(500);
                    td.Abort();
                }

                this.Dispatcher.Invoke(new Action(() =>
                {
                    lblCancel.Visibility   = Visibility.Hidden;
                    btnDownload.Visibility = Visibility.Visible;
                    btnDownload.IsEnabled  = true;
                }));
            });
        }
        private void BtnDownload_Click(object sender, RoutedEventArgs e)
        {
            DataGridTemplateColumn column = this.grdList.Columns[0] as DataGridTemplateColumn;
            //获取指定的行与列相交位置的单元格
            FrameworkElement element = column.GetCellContent(this.grdList.Items[this.grdList.SelectedIndex]);
            var    bar         = column.CellTemplate.FindName("progressCtl", element) as ProgressBar;
            var    btnShow     = column.CellTemplate.FindName("btnShow", element) as Button;
            var    btnDownload = sender as Button;
            Border b           = btnDownload.Template.FindName("ContentContainer", btnDownload) as Border;
            Button btnCancel   = column.CellTemplate.FindName("btnCancel", element) as Button;

            string filePath = btnShow.Tag != null?btnShow.Tag.ToString() : string.Empty;

            if (string.IsNullOrEmpty(filePath))
            {
                var m_Dialog = new System.Windows.Forms.FolderBrowserDialog();
                System.Windows.Forms.DialogResult result = m_Dialog.ShowDialog();

                if (result == System.Windows.Forms.DialogResult.Cancel)
                {
                    return;
                }
                filePath = m_Dialog.SelectedPath.Trim();
            }

            var index   = this.grdList.SelectedIndex;
            var rowData = AppList[index];

            (sender as Button).IsEnabled = false;

            string downFoldar = filePath;

            btnShow.Tag = filePath;
            if (!Directory.Exists(downFoldar))
            {
                Directory.CreateDirectory(downFoldar);
            }

            Thread td = new Thread(() =>
            {
                DownloadHelper downLoadHelper = null;
                try
                {
                    this.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        btnCancel.Visibility   = Visibility.Visible;
                        btnDownload.Visibility = Visibility.Hidden;
                    }));

                    string serverFileUrl = rowData.DownUrl;
                    downLoadHelper       = new DownloadHelper(serverFileUrl, downFoldar);
                    downLoadHelper.GetTotalSize();
                    this.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        bar.Maximum = downLoadHelper.TotalSize;
                    }));

                    string downLoadStep = ConfigHelper.GetAppSettingValue("DownloadStep");

                    downLoadHelper.Step = !string.IsNullOrEmpty(downLoadStep) ? Convert.ToInt32(downLoadStep) : 102400;

                    while (!downLoadHelper.IsFinished && !DicIsStop[index])
                    {
                        downLoadHelper.Download();
                        this.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            bar.Visibility = Visibility.Visible;
                            bar.Value      = downLoadHelper.CurrentSize;
                        }));
                    }

                    if (downLoadHelper.IsFinished)
                    {
                        string localFileName = downLoadHelper.FilePath;
                        string localMd5      = CommonHelper.GetMD5HashFromFile(localFileName);

                        if (localMd5 == rowData.MD5)
                        {
                            this.Dispatcher.BeginInvoke(new Action(() =>
                            {
                                this.Dispatcher.BeginInvoke(new Action(() =>
                                {
                                    btnDownload.Visibility = Visibility.Hidden;
                                    btnShow.Visibility     = Visibility.Visible;
                                    btnCancel.Visibility   = Visibility.Hidden;
                                }));
                            }));
                        }
                        else
                        {
                            File.Delete(localFileName);
                            this.Dispatcher.BeginInvoke(new Action(() =>
                            {
                                MessageBoxEx.Show(this, string.Format(Message.DownFail, rowData.AppName), Message.Tips, MessageBoxExButtons.OK, MessageBoxExIcon.Error);

                                btnDownload.Visibility = Visibility.Visible;
                                b.Background           = new ImageBrush
                                {
                                    ImageSource = new BitmapImage(new Uri(PRO_ReceiptsInvMgr.Resources.Common.IcoDownRestart))
                                };
                                btnDownload.IsEnabled = true;
                                btnShow.Visibility    = Visibility.Hidden;
                                btnCancel.Visibility  = Visibility.Hidden;
                                bar.Visibility        = Visibility.Hidden;
                            }));
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (!(ex is System.Threading.ThreadAbortException))
                    {
                        string errMsg = PRO_ReceiptsInvMgr.Resources.Message.NetworkError;

                        this.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            MessageBoxEx.Show(this, errMsg, Message.Tips, MessageBoxExButtons.OK, MessageBoxExIcon.Error);

                            btnCancel.Visibility   = Visibility.Hidden;
                            bar.Visibility         = Visibility.Hidden;
                            btnDownload.Visibility = Visibility.Visible;
                            btnDownload.IsEnabled  = true;
                        }));
                        Logging.Log4NetHelper.Error(typeof(AppDownload), string.Format(PRO_ReceiptsInvMgr.Resources.Message.DownAppFail, rowData.AppName) + ex.Message + System.Environment.NewLine + ex.StackTrace);
                    }
                }
                finally
                {
                    if (DicMap.Keys.Contains(index))
                    {
                        DicMap.Remove(index);
                    }
                    if (downLoadHelper != null)
                    {
                        downLoadHelper.Dispose();
                    }
                }
            });

            td.IsBackground = true;
            td.Start();

            DicMap.Add(index, td);

            if (!DicIsStop.ContainsKey(index))
            {
                DicIsStop.Add(index, false);
            }
            else
            {
                DicIsStop[index] = false;
            }
        }