WPF RichTextBox 中的只读 Run 元素?

2024-06-25

我可能完全是在想象这一点,但我可以发誓有一种方法可以使 RichTextBox 中的各个 Run(或 Parapgraph)元素成为只读。我还可以发誓,几周前我自己尝试了一种方法,并对结果感到满意 - 我隐约记得它看起来像这样:

<RichTextBox x:Name="richTextBox"
             AcceptsTab="True"
             AcceptsReturn="True"
             FontFamily="Courier New"
             FontSize="14">
    <FlowDocument>
        <Paragraph>
            <Run IsReadOnly="True">I wish this was read-only!</Run>
        </Paragraph>
    </FlowDocument>
</RichTextBox>

现在,几周后,我尝试将 RichTextBox 中的 Run 元素设置为只读,却发现这似乎不可能。

MSDN 论坛上的这篇文章 http://social.msdn.microsoft.com/forums/en-US/wpf/thread/329079fc-8555-4192-b90e-6fccd43bf28a似乎证实了这一点。

这是我完全想象出来的吗?或者有办法做我想做的事吗?


好吧,我已经想出了一个适合我的情况的解决方案 - 但可能不适用于每个想要这样的东西的人。虽然很乱,但它能完成工作。

几天内我不会接受我自己的答案,以防万一其他人有更好的方法来完成这个任务。

首先,我们来看看 XAML:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1"
        Height="500"
        Width="600">
    <DockPanel LastChildFill="True">
        <RichTextBox x:Name="rtb"
                     FontFamily="Courier New"
                     FontSize="14"
                     PreviewKeyDown="rtb_PreviewKeyDown">
            <FlowDocument>
                <Paragraph>
                    <InlineUIContainer Unloaded="InlineUIContainer_Unloaded">
                        <TextBlock FontFamily="Courier New" FontSize="14">This line of text is not editable.</TextBlock>
                    </InlineUIContainer>
                    <Run Foreground="Blue">But this is editable.</Run>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </DockPanel>
</Window>

以及背后的代码:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void InlineUIContainer_Unloaded(object sender, RoutedEventArgs e)
        {
            (sender as InlineUIContainer).Unloaded -= new RoutedEventHandler(InlineUIContainer_Unloaded);

            TextBlock tb = new TextBlock();
            tb.FontFamily = new FontFamily("Courier New");
            tb.FontSize = 14;
            tb.Text = "This line of text is not editable.";

            TextPointer tp = rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Forward);
            InlineUIContainer iuic = new InlineUIContainer(tb, tp);
            iuic.Unloaded += new RoutedEventHandler(InlineUIContainer_Unloaded);
        }

        private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                var newPointer = rtb.Selection.Start.InsertLineBreak();
                rtb.Selection.Select(newPointer, newPointer);

                e.Handled = true;
            }
        }
    }
}

我的解决方案依赖于这样一个事实:当InlineUIContainer已从 UI 中删除,它是Unloaded()方法被调用。此时,我只需重新插入已删除的InlineUIContainer在当前插入符位置。

与任何黑客一样,也有很多缺点。我发现的缺点如下:

  • 我想要只读的文本需要包裹在InlineUIContainer。这对该解决方案有一点限制。
  • 我必须捕获“Enter”键并手动插入换行符,否则,InlineUIContainer.Unloaded()每次按下 Enter 键时都会持续触发。不好玩,但它适用于我的情况。

这不是一个很好的解决方案,但我认为它对我有用。就像我说的,我不会将此标记为我自己问题的答案 - 希望其他人有更好的方法来做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF RichTextBox 中的只读 Run 元素? 的相关文章

  • C# WPF - 应用程序图标 + ShowInTaskbar = False

    我创建了一个具有以下属性的自定义分层 WPF 窗口 允许透明度 True 在任务栏显示 False 背景 透明 最上面 True 图标 图标 ico 我已在 项目属性 gt 应用程序 选项卡下添加了 Icon ico 如果 ShowInTa
  • Windows 更新 KB4040972/73 导致 WPF 类出现黑色图像

    我有一个依赖于深度缩放图像 从 PNG 转换为各种比例的 JPG 金字塔 的应用程序 我们使用 DeepZoomTools dll 来实现 这依赖于PresentationCore dll 多年来一直运行良好 推出 KB4040972 和
  • CanExecute 何时被调用?

    在演示中 我有一个按钮可以切换布尔字段isAsking 我创建了一个命令 该命令仅在以下情况下执行isAsking true 一旦我按下切换按钮 okButton IsEnable立即更改 这表明该命令发现了更改isAsking 我感到很困
  • wpf自定义控件:另一个矩形内的可拖动/可调整大小的矩形

    我正在研究一个带有两个矩形的控件 一个在另一个矩形内 我希望用户能够拖动内部矩形 调整其大小 如果可能的话 也可以在外部矩形的边界内旋转它 这些值应该是可绑定的 以便我可以在更新时将这些值存储在我的数据源中 是否已经有这样的控件或者有人有任
  • DockPanel 选项卡顺序

    我在 ItemsControl 的 DataTemplate 中设置了一个 DockPanel 如下所示
  • WCF 中是否可以在没有无参数构造函数的情况下序列化对象?

    我知道私有无参数构造函数可以工作 但是没有无参数构造函数的对象又如何呢 我想公开来自第三方库的类型 因此我无法控制类型定义 如果有办法的话什么是最简单的 例如 我不知道必须创建子类型 Edit 我正在寻找类似此处所示的定制级别 http m
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 如何在 WPF 中更改按钮 MouseOver 的背景?

    我的页面上有一个带有以下 XAML 的按钮
  • 当 View 被渲染/实例化时通知 ViewModel

    我有一个自定义用户控件 ChartControl 我在我的 WPF 应用程序中使用 MainApp 我渲染如下
  • 在wpf中移动鼠标

    我目前正在寻找一种在 wpf 中移动鼠标的方法 我发现的只是我无法可靠实现的非托管方法调用 有没有一种简单的方法可以将鼠标光标移动到某个地方 即 双击后 我肯定在这里遗漏了一些东西 添加对System Windows Forms dll的引
  • 如何隐藏 WPF 控件的一部分

    是否可以隐藏 WPF 控件的一部分 NET 4 有一个 DatePicker 它呈现 4 个部分 根据MSDN http msdn microsoft com en us library cc278067 v vs 95 aspx 是否可以
  • C# ObservableCollection OnCollectionChanged 在项目更改时不会触发

    来自 MSDN 关于 OnCollectionChanged 的 内容 在添加 删除 更改 移动项目或刷新整个列表时发生 我正在更改附加到位于我的集合中的 obj 的属性 但 OnCollectionChanged 未触发 我正在 obj
  • 如何动态设置 WPF DataGridCell 样式

    我有一个 DataGrid 其 itemsSource 定义如下 dg ItemsSource new ObservableCollection
  • nAnt 是否仍受支持并适用于 .net 3.5/VS2008?

    我正在使用 MSBuild 来构建我的东西 我想通过构建服务器使用 CruiseControl net 现在 CCNET 经常引用 nAnt 但看起来 ccnet 可以通过项目配置和 msbuild 完成 nant 可以完成的大部分工作 另
  • 调用异步方法和 Task.Run 异步方法之间的区别

    我的视图模型中有一个方法 private async void SyncData SyncMessage syncMessage if syncMessage State SyncState SyncContacts this SyncCo
  • 如何在 WPF Visual Studio 设计器中显示占位符值,直到可以加载实际值

    我是一名经验丰富的 C 开发人员 但还是一名 WPF 新手 我认为是基本问题 我无法通过网络搜索找到答案 这是简化的用例 我想在 WPF TextBlock 中显示一个字符串 所以我在 XAML 控件的代码隐藏中编写了一些 C 代码 pub
  • UWP 将 GetBindingExpression 与 x:Bind 结合使用

    我正在将我的 UWP 应用程序从 Binding 重写为 x Bind 我在不同的文本框中有一个 TextChanged 事件 通过 Binding 我可以使用 GetBindingExpression 来更新模型 x Bind 是否有等效
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的

随机推荐

  • GRANT EXECUTE 所需的权限

    我正在为需要能够创建和删除过程但也向其他用户授予执行权限的用户创建一个组 GRANT CREATE PROCEDURE TO xxx xxx GRANT ALTER ON SCHEMA dbo TO xxx xxx 但是 我需要向组授予什么
  • 使用空合并运算符进行初始化?

    我可能没有很好地掌握 操作员然而却遇到了一个我无法解释的设计缺陷 比较以下两个属性 唯一的区别在于初始化方式 第一个显式初始化 而第二个使用 运算符 或者我在这里做错了 如果我使用这两个属性运行 data init 则基于第一个属性的集合将
  • SQL IN 子句比单个查询慢

    我正在使用 Hibernate 的 JPA 实现和 MySQL 5 0 67 MySQL 配置为使用 InnoDB 在执行 JPA 查询 转换为 SQL 时 我发现使用IN子句比执行单个查询慢 例子 SELECT p FROM Person
  • Android 响应 Intent 中的 URL

    我希望当用户访问某个网址时启动我的意图 例如 android 市场使用http market android com http market android com 网址 youtube 也是如此 我希望我的也能这样做 我做到了 使用
  • 为什么我在简单的 DB2 select 语句上收到“数据转换或数据映射错误。SQLCODE=-802”?

    我正在使用 PHP 访问 IBM i AS400 上的 DB2 信息 有了这个代码 query SELECT FROM QS36F MYTABLE WHERE MYFIELD 120006 result db2 prepare conn q
  • iOS 8 自定义键盘扩展 UIKeyboardType

    我正在构建一个 iOS 8 自定义键盘 我希望根据 UIKeyboardType 更改键盘的布局 但是 在 UIInputViewController 中读取的键盘类型始终为 0 有什么建议么 提前致谢 void viewDidLoad s
  • Android Studio - Gradle 刷新失败

    我正在使用最新版本的 android studio 来构建我的 android 应用程序 gradle 包装器设置了 gradle 安装 并且项目构建没有错误 最终我每次重新启动时都会遇到一个错误 Gradle 配置项目 App 时出现问题
  • Swagger 定义中的 BigDecimal 作为 String

    我想定义一个对象大十进制作为字符串swagger json 现在我可以做 MyObject type object properties amountOfMoney type string pattern d d name type str
  • rpy2 (版本 2.3.10) - 将数据从 R 包导入到 python 中

    因此 我尝试将一些数据从 R 包导入到 python 中 以测试我编写的其他一些 python rpy2 函数 特别是 我正在使用SpatialEpiR 中的包和pennLC数据集 所以我能够导入 rpy2 包并正确连接到该包 但是 我不确
  • CMake编译java代码

    是否可以使用CMake来编译并运行java代码 从命令行我在终端上编写的命令是 javac classpath theClasspath mainClass java java classpath theClasspath mainClas
  • 用于页面之间导航的自定义动画 Xamarin.forms?

    我使用 Xamarin Forms 创建简单的应用程序 需要将导航设置为上下左右状态 如果你想要上下动画 不是自定义动画 你可以简单地使用Navigation PushModalAsync page 来呈现页面 此外 我刚刚编写了一个自定义
  • 根据 HTTP 状态代码为 GCP Cloud Functions 设置警报策略 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想设置云监控 以便每次我的云功能响应 4xx 5xx HTTP 状态代码时向我发出警报 请告诉我如何从 Cloud Console 实施此
  • 我应该在 Erlang 中使用 try catch 还是应该传回错误标记?

    我正在用 Erlang 进行编码 但我有点不确定如何处理错误 尤其是在看到 Erlang 总是返回的丑陋错误之后 我应该在 Erlang 中使用 try catch 还是应该传回错误标记 在顺序 Erlang 中执行异常处理的基本方法有以下
  • 不理解java中对象的作用域(java新手困惑)

    这个问题是基于对象范围的章节 Java 思维 第二版 第 109 页它说当我们使用创建一个Java对象时new它在范围的末尾徘徊 它给出了这个例子 String s new String a string end of scope 然后它说
  • 在 Google Colab 笔记本中启动 Dash 应用

    如何启动 Dash 应用程序 http dash plot ly http dash plot ly 来自 Google Colab https colab research google com https colab research
  • 删除数据框值的后缀

    我有一个这样完成的数据框 a b c 1 2011 mal ID9 2 2012 yesterday ID10 3 2010 misch ID10 4 1995 ship ID9 5 2008 se ID9 6 1998 falling I
  • 在Xcode7中播放音频

    我只是想在点击按钮时播放音频 但是这行代码出现错误 ButtonAudioPlayer AVAudioPlayer contentsOfURL ButtonAudioURL error nil 这是我的整个代码 import UIKit i
  • 如何在超时的情况下取消龙卷风中挂起的异步任务?

    我的设置是 python 龙卷风服务器 它使用异步处理任务ThreadPoolExecutor 在某些情况下 任务可能会变成无限循环 随着with timeout装饰器 我已经设法捕获超时异常并向客户端返回错误结果 问题是该任务仍在后台运行
  • 无法将 [] 索引应用于“System.Collections.Specialized.NameValueCollection”类型的表达式

    我已经尝试了一切方法来访问 AppSettings 但无法使其正常工作 我有一个需要访问网络 AppSettings 的类库 我查过了 没有 System Collections Specialized NameValueCollectio
  • WPF RichTextBox 中的只读 Run 元素?

    我可能完全是在想象这一点 但我可以发誓有一种方法可以使 RichTextBox 中的各个 Run 或 Parapgraph 元素成为只读 我还可以发誓 几周前我自己尝试了一种方法 并对结果感到满意 我隐约记得它看起来像这样