WPF:如何使RichTextBox看起来像TextBlock?

如何使RichTextBox没有边距,边框,填充等? 换句话说,以与TextBlock相同的方式显示内容呢? 我试过这个:

   LLL   LLL 

但结果产生的仍然不是我想要的:

在此处输入图像描述

在文档内容之前还有一些空间(也可能在文档的顶部或底部之后……)。 我该如何删除它?


如果你有兴趣为什么我需要这个:我试图让HB回答我的问题在WPF中创建吉他和弦编辑器来处理字距并且我不希望在字符之间有不自然的空间。


编辑

所以至少不仅仅是ControlTemplate ,因为下面的代码会产生完全相同的结果(如上图所示):

        LLL   

我觉得这个问题很容易回答…… 有趣的观察:当我有模板集并在FlowDocument上设置PagePadding="0"它会在VisualStudio设计器中显示我想要的布局直到我运行演示 。 在演示中再次出错……当我关闭演示时,设计师再次出错了。 这是VS的一个小错误,或者它实际上设置为正确的布局一段时间但是有些东西会将PagePadding值更改回某个错误的值?


编辑#2

丹尼尔罗斯的编辑答案也不适用于我。 这是XAML:

  hello  

这是代码:

 public static DependencyProperty PagePaddingProperty = DependencyProperty.Register("PagePadding", typeof(Thickness), typeof(EditableTextBlock), new PropertyMetadata(new Thickness(0))); public Thickness PagePadding { get { return (Thickness)GetValue(PagePaddingProperty); } set { SetValue(PagePaddingProperty, value); } } 

结果没有变化 。 空间依旧。


编辑#3

添加双向绑定后,丹尼尔罗斯在他的拉斯编辑中提出它可行。 我仍然不认为它非常清楚(具有依赖属性,因为我需要将PagePadding保持为0值)。 我认为这是一个黑客攻击方法。 如果有人有更好的解决方案,请分享。

显然,将FlowDocumentPagePadding ”更改为0,5是一个错误。 如果有人拥有MSDN帐户,如果他们报告此错误会很好。

我知道这很烦人。

RichTextBox将此PagePadding设置在其CreateRenderScope() ,即当它连接到可视树时。 此时所有属性通常都已设置,因此PagePadding将被重置。

我要向您展示的是一种更为通用的forms,您可以使用附加属性来实现此目的。 在我自己的代码中,我通常更紧密地执行此操作,因为我知道a)flowdocument不会更改(不必担心两次注册相同的处理程序)和b)填充不会更改(事件处理程序只是((FlowDocument)s).PagePadding = new Thickness(0.0);虽然这是SO,但我会提供一个你可以插入的通用解决方案。

解决方案:

     text    

 public static class FlowDocumentPagePadding { public static Thickness GetPagePadding(DependencyObject obj) { return (Thickness)obj.GetValue(PagePaddingProperty); } public static void SetPagePadding(DependencyObject obj, Thickness value) { obj.SetValue(PagePaddingProperty, value); } public static readonly DependencyProperty PagePaddingProperty = DependencyProperty.RegisterAttached("PagePadding", typeof(Thickness), typeof(FlowDocumentPagePadding), new UIPropertyMetadata(new Thickness(double.NegativeInfinity),(o, args) => { var fd = o as FlowDocument; if (fd == null) return; var dpd = DependencyPropertyDescriptor.FromProperty(FlowDocument.PagePaddingProperty, typeof(FlowDocument)); dpd.RemoveValueChanged(fd, PaddingChanged); fd.PagePadding = (Thickness) args.NewValue; dpd.AddValueChanged(fd, PaddingChanged); })); public static void PaddingChanged(object s, EventArgs e) { ((FlowDocument)s).PagePadding = GetPagePadding((DependencyObject)s); } } 

原始源代码评论:

RichTextBox.CreateRenderScope()的原始源代码中,开发人员包含了以下注释:

 // Set a margin so that the BiDi Or Italic caret has room to render at the edges of content. // Otherwise, anti-aliasing or italic causes the caret to be partially clipped. renderScope.Document.PagePadding = new Thickness(CaretElement.CaretPaddingWidth, 0, CaretElement.CaretPaddingWidth, 0); 

错误报告

这是关于Microsoft Connect的错误报告

我之前写的所有内容都不起作用。 出于某种原因,PagePadding被覆盖为“5,0”。 但是,当我使用数据绑定时,它工作正常。 所以简单地将数据绑定到0的厚度。为了它的工作,你必须双向数据绑定:

     LLL   LLL   

代码背后:

 namespace WpfApplication1 { using System.ComponentModel; using System.Windows; ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : INotifyPropertyChanged { public MainWindow() { InitializeComponent(); this.DataContext = this; } private Thickness pagePadding; public Thickness PagePadding { get { return this.pagePadding; } set { this.pagePadding = value; this.Changed("PagePadding"); } } private void Changed(string name) { var handlers = this.PropertyChanged; if (handlers != null) { handlers.Invoke(this, new PropertyChangedEventArgs(name)); } } public event PropertyChangedEventHandler PropertyChanged; } } 

试试这个。 它对我有用……它比这里的替代品要少得多……