- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个富文本框,其中可能包含一个字符串,该字符串具有粗体、斜体甚至不同字体和大小的元素。如果我选择整个字符串,包括所有差异,我如何才能“加粗”该字符串而不将整个字符串转换为仅具有“粗体”属性的通用字体?
例如:我想把“This is some text
”变成“This is some text
”
请注意,“is some”仍然是斜体,“text”仍然是不同的字体。
我目前拥有的非常简单:
private void tsBold_Click(object sender, EventArgs e)
{
if (rtb.SelectionFont == null) return;
Font f;
if (tsBold.Checked)
f = new Font(rtb.SelectionFont, FontStyle.Bold);
else
f = new Font(rtb.SelectionFont, FontStyle.Regular);
rtb.SelectionFont = f;
rtb.Focus();
}
当然,这会将完全相同的字体应用于整个选择。有什么方法可以将“粗体”附加到现有字体吗?
回答虽然下面的“官方”答案只是冰山一角,但它是我在正确方向上所需要的插入力。谢谢你的提示。
这是我的官方修复:
我将其添加到我的 RichTextBox 对象中:
/// <summary>
/// Change the richtextbox style for the current selection
/// </summary>
public void ChangeFontStyle(FontStyle style, bool add)
{
//This method should handle cases that occur when multiple fonts/styles are selected
// Parameters:-
// style - eg FontStyle.Bold
// add - IF true then add else remove
// throw error if style isn't: bold, italic, strikeout or underline
if (style != FontStyle.Bold
&& style != FontStyle.Italic
&& style != FontStyle.Strikeout
&& style != FontStyle.Underline)
throw new System.InvalidProgramException("Invalid style parameter to ChangeFontStyle");
int rtb1start = this.SelectionStart;
int len = this.SelectionLength;
int rtbTempStart = 0;
//if len <= 1 and there is a selection font then just handle and return
if (len <= 1 && this.SelectionFont != null)
{
//add or remove style
if (add)
this.SelectionFont = new Font(this.SelectionFont, this.SelectionFont.Style | style);
else
this.SelectionFont = new Font(this.SelectionFont, this.SelectionFont.Style & ~style);
return;
}
using (EnhancedRichTextBox rtbTemp = new EnhancedRichTextBox())
{
// Step through the selected text one char at a time
rtbTemp.Rtf = this.SelectedRtf;
for (int i = 0; i < len; ++i)
{
rtbTemp.Select(rtbTempStart + i, 1);
//add or remove style
if (add)
rtbTemp.SelectionFont = new Font(rtbTemp.SelectionFont, rtbTemp.SelectionFont.Style | style);
else
rtbTemp.SelectionFont = new Font(rtbTemp.SelectionFont, rtbTemp.SelectionFont.Style & ~style);
}
// Replace & reselect
rtbTemp.Select(rtbTempStart, len);
this.SelectedRtf = rtbTemp.SelectedRtf;
this.Select(rtb1start, len);
}
return;
}
然后我更改了点击方法以使用以下模式:
private void tsBold_Click(object sender, EventArgs e)
{
enhancedRichTextBox1.ChangeFontStyle(FontStyle.Bold, tsBold.Checked);
enhancedRichTextBox1.Focus();
}
最佳答案
RTB 不对此提供很好的支持。您甚至无法在选择范围内找到具有相同字体样式的字符范围。首先检查 SelectionFont 属性,如果选择包含多种样式,它将为 null。如果是这种情况,您必须通过设置 SelectionStart 和 SelectionLength 属性一次迭代选择一个字符,读取 SelectionFont 直到它发生变化。将更改后的字体应用于您发现的范围。
检查 this answer寻找一种保持这种速度相当快且无闪烁的方法。
请注意,使用 RTB 实现编辑器是 codeproject.com 上最受欢迎的主题。借用代码(如果不是整个项目)是减轻痛苦的好方法。
关于c# - 更改任何一个元素时如何保持 RichText 格式(粗体/斜体/等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5325918/
下面是我用来制作 1px 文本描边轮廓的代码。但是如何使轮廓变粗呢?如果我只是用“5px”替换所有“1px”,结果看起来很疯狂。 HTML Hello! CSS .element { color:
我是一名优秀的程序员,十分优秀!