gpt4 book ai didi

c# - 限制在 WPF 文本框中输入的行数

转载 作者:太空狗 更新时间:2023-10-30 01:17:01 27 4
gpt4 key购买 nike

我正在尝试限制用户可以在文本框中输入的行数。

我一直在研究 - 我能找到的最接近的是: Limit the max number of chars per line in a textbox .

Limit the max number of chars per line in a textbox结果证明是用于 winforms 的。

这不是我想要的……还值得一提的是,有一个误导性的 maxlines我发现的属性仅限制文本框中显示的内容。

我的要求:

  • 不要求使用等宽字体
  • 将文本框限制为最多 5 行
  • 接受回车
  • 不允许额外的回车
  • 当达到最大长度时停止文本输入
  • 包装文本(不要特别在意它是在单词之间还是将整个单词分开)
  • 处理粘贴到控件中的文本,并且只会粘贴适合的内容。
  • 没有滚动条
  • 另外 - 这很好 - 可以选择限制每行的字符数

这些要求是为了创建一个 WYSIWYG 文本框,该文本框将用于捕获最终将被打印的数据,并且字体需要可变 - 如果文本被截断或对于固定大小的行来说太大 - 那么它将以这种方式打印出来(即使它看起来不正确)。

我自己尝试过通过处理事件来做到这一点 - 但我很难做到这一点。到目前为止,这是我的代码。

XAML

 <TextBox TextWrapping="Wrap" AcceptsReturn="True"
PreviewTextInput="UIElement_OnPreviewTextInput"
TextChanged="TextBoxBase_OnTextChanged" />

代码隐藏

 public int TextBoxMaxAllowedLines { get; set; }
public int TextBoxMaxAllowedCharactersPerLine { get; set; }


public MainWindow()
{
InitializeComponent();

TextBoxMaxAllowedLines = 5;
TextBoxMaxAllowedCharactersPerLine = 50;
}

private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;

int textLineCount = textBox.LineCount;

if (textLineCount > TextBoxMaxAllowedLines)
{
StringBuilder text = new StringBuilder();
for (int i = 0; i < TextBoxMaxAllowedLines; i++)
text.Append(textBox.GetLineText(i));

textBox.Text = text.ToString();
}

}

private void UIElement_OnPreviewTextInput(object sender, TextCompositionEventArgs e)
{
TextBox textBox = (TextBox)sender;

int textLineCount = textBox.LineCount;


for (int i = 0; i < textLineCount; i++)
{
var line = textBox.GetLineText(i);

if (i == TextBoxMaxAllowedLines-1)
{
int selectStart = textBox.SelectionStart;
textBox.Text = textBox.Text.TrimEnd('\r', '\n');
textBox.SelectionStart = selectStart;

//Last line
if (line.Length > TextBoxMaxAllowedCharactersPerLine)
e.Handled = true;
}
else
{
if (line.Length > TextBoxMaxAllowedCharactersPerLine-1 && !line.EndsWith("\r\n"))
e.Handled = true;
}

}
}

这不太正确 - 我在最后一行出现奇怪的行为,文本框中的选定位置不断跳动。

顺便说一句,也许我走错了路……我也想知道这是否可以通过使用正则表达式来实现,如下所示:https://stackoverflow.com/a/1103822/685341

我对任何想法都持开放态度,因为我已经为此苦苦挣扎了一段时间。上面列出的要求是不可变的 - 我无法更改它们。

最佳答案

这是我的最终解决方案 - 我仍然想听听是否有人能想出更好的方法...

这只处理最大行数——我还没有对最大字符数做任何事情——但它在逻辑上是对我已经完成的事情的简单扩展。

当我正在处理文本框的 textChanged 事件时——这也涵盖了进入控件——我还没有找到一个干净的方法来截断这个事件中的文本(除非我单独处理 key_preview)——所以我m 只是不允许通过撤消进行无效输入。

XAML

<TextBox TextWrapping="Wrap" AcceptsReturn="True" 
HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled">
<i:Interaction.Behaviors>
<lineLimitingTextBoxWpfTest:LineLimitingBehavior TextBoxMaxAllowedLines="5" />

</i:Interaction.Behaviors>
</TextBox>

代码(行为)

/// <summary> limits the number of lines the textbox will accept </summary>
public class LineLimitingBehavior : Behavior<TextBox>
{
/// <summary> The maximum number of lines the textbox will allow </summary>
public int? TextBoxMaxAllowedLines { get; set; }

/// <summary>
/// Called after the behavior is attached to an AssociatedObject.
/// </summary>
/// <remarks>
/// Override this to hook up functionality to the AssociatedObject.
/// </remarks>
protected override void OnAttached()
{
if (TextBoxMaxAllowedLines != null && TextBoxMaxAllowedLines > 0)
AssociatedObject.TextChanged += OnTextBoxTextChanged;
}

/// <summary>
/// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred.
/// </summary>
/// <remarks>
/// Override this to unhook functionality from the AssociatedObject.
/// </remarks>
protected override void OnDetaching()
{
AssociatedObject.TextChanged -= OnTextBoxTextChanged;
}

private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;

int textLineCount = textBox.LineCount;

//Use Dispatcher to undo - http://stackoverflow.com/a/25453051/685341
if (textLineCount > TextBoxMaxAllowedLines.Value)
Dispatcher.BeginInvoke(DispatcherPriority.Input, (Action) (() => textBox.Undo()));
}
}

这需要 System.Windows.InterActivity因此要添加到项目并在 XAML 中引用:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

关于c# - 限制在 WPF 文本框中输入的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com