将以下代码复制并粘贴到 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解决此问题?
答案 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”,这是默认设置。