防止在Wpf RichTextBox中删除文本

时间:2019-03-27 15:48:07

标签: c# wpf vb.net

将以下代码复制并粘贴到 MainWindow.xaml 文件中。

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
    <RichTextBox>
        <FlowDocument>
            <Paragraph>
                <Run Text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."/>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</Grid>
</Window>

运行此代码,然后查看您是否可以删除该文本。

我希望您不能删除该文本。

在以下链接中可以看到 WinForm 的解决方案,因为WinForm RichTextBox 具有选择保护的属性

Preventing a Certain Text to be Deleted or Change in a RichTextBox

WPF RichTextBox 没有选择保护 属性。那么如何为WPF解决此问题?

2 个答案:

答案 0 :(得分:0)

尝试一下。

<RichTextBox IsReadOnly="True">

或者如果您根本不想选择任何内容。

<RichTextBox IsEnabled="false">

答案 1 :(得分:-1)

这个问题已经存在了几个月,但是,如果您仍然有兴趣,我创建了一个解决方案,用于保护WPF RichTextBox中的文本,如果您愿意,我会发布。

编辑:好的,我还是将其发布,为什么不呢:)

因此,它的作用是让您可以基于 TextRange 的属性动态设置不可编辑的范围。这里唯一的问题是必须选择一个晦涩的属性,可以确定不会在 FlowDocument 中找到该属性。 在这种情况下,我选择了 DependencyProperty FontStretches.UltraCondensed 。但是您可以将任何有效的代码用于TextBlock。

因此,在 RichTextBox PreviewKeyDown 事件中,只需添加以下代码:

    // Disable editing of protected text (=UltraCondensed FontStretch)
            if (!(e.Key == Key.Left | e.Key == Key.Right | e.Key == Key.Up | e.Key == Key.Down | e.Key == Key.LeftShift))
            {
                var trange = new TextRange(richTextBox.Selection.Start, richTextBox.Selection.End);
                bool isProtected = false;
                switch (trange.Text.Length)
                {
                    case 0:
                        {
                            // Zero length selection
                            if (e.Key == Key.Back)
                                trange = new TextRange(trange.Start.GetNextInsertionPosition(LogicalDirection.Backward).GetInsertionPosition(LogicalDirection.Forward), trange.Start);
                            else if (e.Key == Key.Delete)
                                trange = new TextRange(trange.End.GetInsertionPosition(LogicalDirection.Forward), trange.End.GetNextInsertionPosition(LogicalDirection.Forward));
                            isProtected = trange.GetPropertyValue(FontStretchProperty) == FontStretches.UltraCondensed;
                            break;
                        }

                    default:
                        {
               //RichTextBox selection has length
isProtected = trange.GetPropertyValue(FontStretchProperty) == DependencyProperty.UnsetValue || trange.GetPropertyValue(FontStretchProperty) == FontStretches.UltraCondensed;
                            break;
                        }
                }

                if (isProtected)
                {
                    e.Handled = true; return;
                }
            }

排除 Key.Left Key.Right 等原因的原因是,您仍然希望能够浏览受保护的文本,以及区分选择长度0或非零是因为如果您选择的长度(多个运行)和运行具有不同的属性,则 GetProperty 将返回“ UnsetValue”。

然后,要取消保护文本,只需将“ UltraCondensed”(或其他属性)设置为“ FontWeights.Normal”,这是默认设置。