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

Ras*_*sto 13 .net c# wpf padding richtextbox

如何RichTextBox在没有边距,边框,填充等的情况下制作?换句话说,以同样的方式显示内容TextBlock?我试过这个:

<RichTextBox Margin="0" Padding="0" Grid.Row="0" BorderThickness="0" >
    <FlowDocument >
        <Paragraph>LLL</Paragraph>
    </FlowDocument>
</RichTextBox>
<TextBlock>LLL</TextBlock>
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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


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


编辑

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

<RichTextBox Margin="0" Padding="0" Grid.Row="0" BorderThickness="0">
    <RichTextBox.Template>
        <ControlTemplate>
            <ScrollViewer Padding="0" Margin="0" x:Name="PART_ContentHost"/>
        </ControlTemplate>
    </RichTextBox.Template>
    <FlowDocument PagePadding="0">
        <Paragraph Padding="0" Margin="0" >LLL</Paragraph>
    </FlowDocument>
</RichTextBox>
Run Code Online (Sandbox Code Playgroud)

而且我认为这将是问题容易回答...... 有趣的现象:当我有模板设置,我设置PagePadding="0"FlowDocument 是显示我要布局在VisualStudio的设计师- 直到我运行演示.在演示中再次出错......当我关闭演示时,设计师再次出错了.这是VS的一个小错误,或者它实际上设置为正确的布局一段时间但是然后某些东西会将值更改PagePadding回某个错误的值?


编辑#2

丹尼尔罗斯编辑的答案也不适合我.这是XAML:

<FlowDocument PagePadding="{Binding PagePadding}">
    <Paragraph x:Name="paragraph" Padding="0" 
        TextIndent="0"  Margin="0,0,0,0" >hello</Paragraph>
</FlowDocument>
Run Code Online (Sandbox Code Playgroud)

这是代码:

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); }
}
Run Code Online (Sandbox Code Playgroud)

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


编辑#3

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

显然,"改变PagePadding的" FlowDocument0,5是一个错误.如果有人拥有MSDN帐户,如果他们报告此错误会很好.

Mar*_*ter 21

我知道这很烦人.

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

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

解决方案:

        <RichTextBox BorderThickness="0" Margin="0" Padding="0">
            <FlowDocument local:FlowDocumentPagePadding.PagePadding="0">
                <Paragraph>
                    <Run>text</Run>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

原始源代码评论:

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);
Run Code Online (Sandbox Code Playgroud)

错误报告

这是Microsoft Connect的错误报告