是否可以在文本和边框之间的Rich Text Box控件中添加填充?
我尝试将一个富文本框对接到一个面板中,其四边的填充设置为10,这就完成了我想要的。除非需要填充富文本框的垂直滚动条,否则也会填充。
答案 0 :(得分:27)
RichTextBox没有填充属性。
可以通过将RichTextBox放在 Panel 中来实现快速和脏填充,它具有与RichTextBox相同的BackColor
属性(通常为Color.White
)。
然后,将RichTextBox的Dock
属性设置为Fill
,并使用Panel控件的Padding
属性。
答案 1 :(得分:22)
将这两者结合在一起,你可以做到这一点:
......看起来像这样:
我写了a small C# extension class来包装这一切。
用法示例:
const int dist = 24;
richTextBox1.SetInnerMargins(dist, dist, dist, 0);
这将左边,上边和右边的内边距设置为24,底部为零。
请注意,滚动时,上边距保持不变,如下所示:
就个人而言,这对我来说看起来“不自然”。我希望滚动上边距时也是零。
也许有一种解决方法......
截至要求:
public static class RichTextBoxExtensions
{
public static void SetInnerMargins(this TextBoxBase textBox, int left, int top, int right, int bottom)
{
var rect = textBox.GetFormattingRect();
var newRect = new Rectangle(left, top, rect.Width - left - right, rect.Height - top - bottom);
textBox.SetFormattingRect(newRect);
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public readonly int Left;
public readonly int Top;
public readonly int Right;
public readonly int Bottom;
private RECT(int left, int top, int right, int bottom)
{
Left = left;
Top = top;
Right = right;
Bottom = bottom;
}
public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
{
}
}
[DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect);
[DllImport(@"user32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);
private const int EmGetrect = 0xB2;
private const int EmSetrect = 0xB3;
private static void SetFormattingRect(this TextBoxBase textbox, Rectangle rect)
{
var rc = new RECT(rect);
SendMessageRefRect(textbox.Handle, EmSetrect, 0, ref rc);
}
private static Rectangle GetFormattingRect(this TextBoxBase textbox)
{
var rect = new Rectangle();
SendMessage(textbox.Handle, EmGetrect, (IntPtr) 0, ref rect);
return rect;
}
}
答案 2 :(得分:10)
我遇到了同样的问题,所描述的答案对我没有帮助,这对我有用,所以如果有帮助的话我会分享它。
richTextBox1.SelectAll();
richTextBox1.SelectionIndent += 15;//play with this values to match yours
richTextBox1.SelectionRightIndent += 15;//this too
richTextBox1.SelectionLength = 0;
//this is a little hack because without this
//i've got the first line of my richTB selected anyway.
richTextBox1.SelectionBackColor = richTextBox1.BackColor;
答案 3 :(得分:6)
一种快速简便的方法是通过在表单加载和表单/控件调整大小事件中调用此示例方法来从垂直滚动中偏移文本:
private void AdjustTextBoxRMargin()
{
richTextBox1.RightMargin = richTextBox1.Size.Width - 35;
}
35的值似乎适用于Win7,但在其他版本的Windows上可能有所不同。
答案 4 :(得分:3)
由于RichTextBox没有填充属性。您可以创建自己的RichTextBoxSubclass,如本文所示:
http://www.codeproject.com/Articles/21437/A-Padded-Rich-Text-Box-Subclass
答案 5 :(得分:1)
也许这就是你需要的东西?
richTextBox.SelectionIndent += 20;
答案 6 :(得分:0)
在controltemplate中,内容部分是这样的:
<ScrollViewer x:Name="PART_ContentHost"
Style="{StaticResource ScrollViewerTextBox}"
VerticalAlignment="Top"/>`
为滚动查看器创建样式(和控件模板);在Grid列上将MinWidth设置为类似于滚动条的宽度,并在ScrollContentPresenter上根据您的喜好调整边距。
<Style x:Key="ScrollViewerTextBox" TargetType="{x:Type ScrollViewer}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto" MinWidth="18"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ScrollContentPresenter Grid.Column="0" Margin="3 3 3 0" CanVerticallyScroll="True" CanContentScroll="True"/>
<ScrollBar x:Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="1"
Value="{TemplateBinding VerticalOffset}"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}">
<ScrollBar.ContextMenu>
<ContextMenu Visibility="Hidden" />
</ScrollBar.ContextMenu>
</ScrollBar>
<ScrollBar x:Name="PART_HorizontalScrollBar"
Orientation="Horizontal"
Grid.Row="1"
Grid.Column="0"
Value="{TemplateBinding HorizontalOffset}"
Maximum="{TemplateBinding ScrollableWidth}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}">
<ScrollBar.ContextMenu>
<ContextMenu Visibility="Hidden" />
</ScrollBar.ContextMenu>
</ScrollBar>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 7 :(得分:0)
这是一个更简单的答案。它不是可自定义的,但是会在整个文本(顶部,底部,左侧和右侧)周围放置一个小的填充。
在设计时,设置RichTextBox的ShowSelectionMargin
属性
到True
。运行时,您可能会注意到已应用了页边距(从无页边距到页边距),它看起来有点像“ jerkey”。如果是这样,请在加载RichTextBox之前放置一个Me.SuspendLayout
,之后再放置一个Me.ResumeLayout
。
答案 8 :(得分:0)
这是一个简单的解决方案,用于设置RichTextBox的左右边界,这在C#Windows应用程序中对我来说效果很好。它将左右页边距都设置为4像素。
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);
// both left and right margins set to 4 pixels with the last parm: 0x00040004
SendMessage(richtextbox1.Handle, 0xd3, (UIntPtr)0x3, (IntPtr)0x00040004);
我在下面尝试使SendMessage更合适:
const int EM_SETMARGINS = 0xd3;
const int EC_LEFTMARGIN = 0x1;
const int EC_RIGHTMARGIN = 0x2;
SendMessage(richtextbox1.Handle, EM_SETMARGINS,
(UIntPtr)(EC_LEFTMARGIN | EC_RIGHTMARGIN), (IntPtr)0x00040004);
我认为问题最初发布时无法解决。
答案 9 :(得分:-1)
也许你正在寻找缩进文字?像左右缩进? 如果是这样,那么你可以使用rtf对象的ReGEtIndent和ReSetIndent方法。
我在这做什么:
//first I find the length of the active window
nLen := REGEtIndent( ::oActive:hWnd )
//now resetIndents of the rtf control
RESetIndent( ::oActive:hWnd, nLen[ 1 ] + 100, nLen[ 2 ] + 100, -25 )
希望有所帮助。
答案 10 :(得分:-3)
将右侧的填充设置为0,然后将RichTextBox的RightMargin设置为10.未经测试,但应该可以正常工作。