private static void IsReadOnlyWithNavigationPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RichTextBoxEx richTextBoxEx = d as RichTextBoxEx;

            if (richTextBoxEx != null && richTextBoxEx.IsReadOnlyWithNavigation)
            {
                richTextBoxEx.IsReadOnly = false;
            }
        }
        private static void ExecutedCopyRoutedCommand(object sender, ExecutedRoutedEventArgs e)
        {
            RichTextBoxEx richTextBoxEx = sender as RichTextBoxEx;

            if (richTextBoxEx != null)
            {
                richTextBoxEx.Copy();
                e.Handled = true;
            }
        }
        private static void ExecutedPasteRoutedCommand(object sender, ExecutedRoutedEventArgs e)
        {
            RichTextBoxEx richTextBoxEx = sender as RichTextBoxEx;

            if (richTextBoxEx != null && !richTextBoxEx.IsReadOnly)
            {
                if (richTextBoxEx.IsReadOnlyWithNavigation)
                {
                    return;
                }
                richTextBoxEx.Paste();
            }
        }
        private static void ExecutedCutRoutedCommand(object sender, ExecutedRoutedEventArgs e)
        {
            RichTextBoxEx richTextBoxEx = sender as RichTextBoxEx;

            if (richTextBoxEx != null)
            {
                if (!richTextBoxEx.IsReadOnly && !richTextBoxEx.IsReadOnlyWithNavigation)
                {
                    richTextBoxEx.Cut();
                }
                e.Handled = true;
            }
        }
        private static void CanExecuteCopyRoutedCommand(object sender, CanExecuteRoutedEventArgs e)
        {
            RichTextBoxEx richTextBoxEx = sender as RichTextBoxEx;

            if (richTextBoxEx != null)
            {
                if (richTextBoxEx.IsReadOnly || richTextBoxEx.IsReadOnlyWithNavigation)
                {
                    e.CanExecute = !richTextBoxEx.Selection.IsEmpty;
                    return;
                }
                e.CanExecute = !richTextBoxEx.Selection.IsEmpty;
            }
        }