私は次のものを持っているとしましょう:
<TextBox TextWrapping="Wrap"
AcceptsReturn="True"
AcceptsTab="True"
MaxLines="3000"/>
1 行あたりの最大文字数を 60 に制限する方法はありますか?
キーダウンイベントを介してそれを行う方法を見てきましたが、それは絶対確実ではないようです(つまり、長いテキストブロックに貼り付けるのはどうですか)。
等幅フォントを選択します。そして、60文字のテキストボックスの幅を計算してください。
TextBox
キーダウン イベントに応答していることを考えると、後ろの文字列が「1 行あたり 60 文字」の規則に従っていることを確認したいと思います。その場合は、 のイベントにサブスクライブするイベントを作成する必要がありTextChanged
ますTextBox
。そこで、テキストを修正し、長すぎる行を切り詰めるか分割することができます。
(編集) Kafuka が提案したように、表示部分を解決するには、ボックスを 60 文字を保持するのに十分な幅にし、確実にしたい場合は等幅フォントを使用します。文字列が正しいことを確認した場合、これは簡単に一致するはずです。
ラッピングすると現在の行がに合わせて変更されるため、ラッピング中にこれを実行できるとは本当に思いませんTextBox
。Notepadを使用している場合でも、ワード ラップを有効にしている間はステータス バーを表示できません。これは、ラップ中に現在の行インデックスとその長さを取得するのが難しいためです。
TextWrapping
プロパティが に設定されている間、1 行あたりの最大文字数を設定することができました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;
}
}
ありがとう、
これがお役に立てば幸いです:)
今日、いくつかのソリューションを見てきました。まったく機能しないか、機能するとしても、私が思うように機能しないかのどちらかです。カーソルの位置がおかしい、または折り返しが正しくない。これが私の「解決策」です。将来誰かに役立つことを願っています。ラップし、アンラップせず、既存の新しい行を保持します。この例を 60 文字幅に設定し、bool 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;
}
};