internal static IDelegateCommand CreateCopyToClipBoardCommand(IHexDataContext hexDataContext)
        {
            var copyToClipBoardCommand = CommandFactory.CreateDelegateCommand(
                () => {
                if (hexDataContext.SelectionStart == -1 || hexDataContext.SelectionLength == -1)
                {
                    return;
                }

                //若需剪切数据大于4GB,提示警告;
                if (hexDataContext.SelectionLength - hexDataContext.SelectionStart > MaxCopyToClipBoardSize)
                {
                    MsgBoxService.Current?.Show(LanguageService.Current?.FindResourceString(Constants.MsgText_TooLargeCopySize));
                    return;
                }

                hexDataContext.Stream.Position = hexDataContext.SelectionStart;

                InterceptStream sourceStream = null;
                StreamReader sr = null;

                try {
                    sourceStream = InterceptStream.CreateFromStream(
                        hexDataContext.Stream,
                        hexDataContext.SelectionStart,
                        hexDataContext.SelectionLength);

                    sr = new StreamReader(sourceStream);
                    ClipBoardService.SetDataObject(sr.ReadToEnd());
                }
                catch (Exception ex) {
                    LoggerService.WriteCallerLine(ex.Message);
                    MsgBoxService.Current?.Show($"{ex.Message}");
                }
                finally {
                    sourceStream?.Dispose();
                    sr?.Dispose();
                }
            });

            return(copyToClipBoardCommand);
        }
        internal static IDelegateCommand CreateCopyToNewFileCommand(IHexDataContext hexDataContext)
        {
            var copyToNewFileCommand = CommandFactory.CreateDelegateCommand(
                () => {
                if (hexDataContext.SelectionLength == -1 || hexDataContext.SelectionStart == -1)
                {
                    return;
                }

                var dialogService = ServiceProvider.Current.GetInstance <IDialogService>();
                if (dialogService == null)
                {
                    LoggerService.WriteCallerLine($"{nameof(dialogService)} can't be null.");
                    return;
                }

                var path = dialogService.GetSaveFilePath();
                if (path == null)
                {
                    return;
                }

                var dialog         = dialogService.CreateLoadingDialog();
                dialog.WindowTitle = LanguageService.FindResourceString(Constants.WindowTitle_DataCopying);
                dialog.DoWork     += (sender, e) => {
                    FileStream fs = null;
                    InterceptStream sourceStream = null;

                    try {
                        fs            = File.Create(path);
                        byte[] buffer = new byte[10485760];
                        int read;
                        long readSize = 0;
                        hexDataContext.Stream.Position = hexDataContext.SelectionStart;

                        sourceStream = InterceptStream.CreateFromStream(
                            hexDataContext.Stream,
                            hexDataContext.SelectionStart,
                            hexDataContext.SelectionLength);

                        while ((read = sourceStream.Read(buffer, 0, buffer.Length)) != 0 && !dialog.CancellationPending)
                        {
                            fs.Write(buffer, 0, read);
                            readSize += read;
                            dialog.ReportProgress((int)(readSize * 100 / sourceStream.Length));
                        }
                    }
                    catch (Exception ex) {
                        LoggerService.WriteCallerLine(ex.Message);
                    }
                    finally {
                        fs?.Dispose();
                        sourceStream?.Dispose();
                    }
                };

                dialog.RunWorkerCompleted += (sender, e) => {
                    if (e.Cancelled)
                    {
                        return;
                    }

                    LocalExplorerService.OpenFolderAndSelectFile(path);
                    MsgBoxService.Current?.Show(LanguageService.Current?.FindResourceString(Constants.WindowTitle_DataCopyDone));
                };

                dialog.ShowDialog();
            }, () => SelectionAvailable(hexDataContext));

            hexDataContext.SelectionStateChanged += delegate {
                copyToNewFileCommand.RaiseCanExecuteChanged();
            };
            return(copyToNewFileCommand);
        }