说我有以下内容:
<TextBox TextWrapping="Wrap"
AcceptsReturn="True"
AcceptsTab="True"
MaxLines="3000"/>
有没有办法可以将每行的最大字符数限制为60?
我已经看到了通过keydown事件来实现的方法,但这似乎并不是万无一失的(即在长文本块中粘贴的内容)。
答案 0 :(得分:1)
选择单声道间隔字体。并计算具有60个字符的文本框的宽度。
答案 1 :(得分:1)
鉴于您正在响应keydown事件,我假设您要确保TextBox
后面的字符串符合“每行60个字符”规则。如果是这种情况,您应该在TextChanged
上发布订阅TextBox
事件的事件。在那里你可以修复文本,并截断或拆分太长的行。
(编辑)要解决显示部分,你可以像Kafuka建议的那样:只需将盒子放宽到足以容纳60个字符,如果你想确定,可以使用等宽字体。如果你确定字符串是正确的,这应该很容易就行了。
答案 2 :(得分:0)
我真的不认为你可以在换行时这样做,因为换行会改变当前行以适应TextBox
。即使在使用记事本时,您仍然无法在启用自动换行时查看状态栏,因为很难获得当前行索引和包裹时的长度。
我设法在TextWrapping
属性设置为NoWrap
时设置每行的最大字符数。您首先需要获取当前行索引的长度。然后,如果它是59或更多,处理输入。
示例强>
<TextBox Name="textBox1"
TextWrapping="NoWrap"
AcceptsReturn="True"
AcceptsTab="True"
MaxLines="3000"
KeyDown="textBox1_KeyDown"/>
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
//Initialize a new int of name CurrentLine to get the current line the user is on
int CurrentLine = textBox1.GetLineIndexFromCharacterIndex(textBox1.Text.Length);
//Continue if the length of the current line is more or equal to 59
if (textBox1.GetLineLength(CurrentLine) >= 59)
{
//Don't insert the character
e.Handled = true;
}
}
谢谢, 我希望你觉得这很有帮助:)
答案 3 :(得分:0)
我知道这是一个非常晚的答案,但是找到这个的人可以得到一个很好的答案,例如Ctrl + C和东西:
private void textBox1_TextChanged(object sender, EventArgs e)
{
foreach (string line in textBox1.Lines)
{
if (line.Length > 60)
{
textBox1.Undo();
}
}
textBox1.ClearUndo();
}
请注意,这确实意味着您不能再在文本框中使用Ctrl + Z,但如果这并不打扰您,这是一个不错的选择,因为它适用于任何字体。
编辑这不适用于wpf文本框,只有Windows格式化文本框
答案 4 :(得分:0)
我今天研究了几种解决方案。他们要么根本不工作,要么如果他们工作了,那么他们就不会按照我认为的方式工作。游标位置或包装错误。这是我的“解决方案”,希望对以后的人有所帮助。它包装,不展开,并保留所有现有的新行。我将此示例设置为60个字符宽,并且在此示例外部设置了一个isBusyUpdating布尔值,以防止在进行更新时再次触发它。
txtNotes.HorizontalContentAlignment = HorizontalAlignment.Left;
txtNotes.VerticalContentAlignment = VerticalAlignment.Top;
txtNotes.TextWrapping = TextWrapping.NoWrap;
txtNotes.AcceptsReturn = true;
txtNotes.TextChanged += delegate (object o, TextChangedEventArgs args)
{
//args.Handled = true;
TextBox thisText = (TextBox)args.Source;
if (!isBusyUpdating)
{
isBusyUpdating = true;
string updatedText = "";
bool blnUpdate = false;
int curPos = thisText.CaretIndex;
foreach (string thisLine in thisText.Text.Split('\n'))
{
if (thisLine.Length > 60)
{
blnUpdate = true;
updatedText = updatedText +
thisLine.Substring(0, 60)
.Replace("\n", "") +
"\n" + thisLine.Substring(60);
curPos++;
}
else
{
updatedText = updatedText + thisLine + "\n";
}
}
if (blnUpdate)
{
thisText.Text = updatedText;
thisText.CaretIndex = curPos-1;
}
isBusyUpdating = false;
}
};