我知道WinUI UWPSelectionStart
的属性将返回. 但是,我想获得文本的确切列和行位置。在WPF中,可用于分别查找当前行索引和列号。如何在WinUI UWP中实现相同的目标? TextBox
CaretIndex
GetLineFromCharacterIndex(CaretIndex)
TextBox.Lines[LineIndex].Length
Textbox
问问题
155 次
3 回答
2
试试这个方法:
public static int GetCurrentLineIndex(TextBox textBox)
{
int caretIndex = textBox.SelectionStart;
if (caretIndex == 0)
return 0;
string[] lines = textBox.Text?.Split('\r') ?? Array.Empty<string>();
int offset = 0;
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
offset += line.Length;
if (caretIndex <= offset)
return i;
offset++;
}
return 0;
}
它可能需要一些细微的改进,但它应该让您了解如何确定光标的当前行。
您可以从要获取索引的任何位置调用它,例如:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
int index = GetCurrentLineIndex(sender as TextBox);
//...
}
于 2021-08-10T14:19:59.010 回答
1
也许你可以做这样的事情:
var text = Textbox.Text;
var lines = text.Split('\r');
...
这在过去使用 WPF 对我有用,但我从未尝试过 UWP。
这似乎也是一种解决方法,因此可能会有更好、更实用的解决方案。
于 2021-08-10T07:51:39.187 回答
1
此示例使用 MVVM 结构,但您可以将相同的概念应用于存储先前值的临时变量。
<TextBox Height="600" Width="600"
Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap" AcceptsReturn="True"/>
然后我将它添加到构造函数中:
this.DataContext = this;
这不是最佳实践,如果您使用的是 MVVM,您将设置一个 ViewModel 并使用它(我这样做是为了测试)。
然后我创建了这样的属性:
private int _line;
public int Line
{
get { return _line; }
set
{
_line = value;
tb1.Text = value.ToString();
}
}
private int _column;
public int Column
{
get { return _column; }
set
{
_column = value;
tb2.Text = value.ToString();
}
}
private string _text;
public string Text
{
get { return _text; }
set
{
if (_text + '\r' != value)
{
Line = GetLine(_text, value);
Column = GetColumn(_text, value, Line);
}
else
{
Line++;
Column = 0;
}
_text = value;
}
}
然后添加了我的功能:
public int GetLine(string original, string newText)
{
var oLines = GenArray(original);
var nLines = GenArray(newText);
//set this to -1 if you want 0-based indexing
int count = 0;
foreach (var line in nLines)
{
count++;
if (oLines.Length < count || line != oLines[count - 1])
{
break;
}
}
return count;
}
public int GetColumn(string original, string newText, int lineChanged)
{
var oLine = GenArray(original)[lineChanged - 1];
var nLine = GenArray(newText)[lineChanged - 1];
//set this to -1 if you want 0-based indexing
int count = 0;
foreach (var c in nLine)
{
count++;
if (oLine.Length < count || c != oLine[count - 1])
{
}
}
return count;
}
private string[] GenArray(string text)
{
string[] lines;
if (text == null)
{
lines = new string[1] { "" };
}
else if (text.Contains('\r'))
{
lines = text.Split('\r');
}
else
{
lines = new string[1] { text };
}
return lines;
}
如果您不使用 MVVM,请执行以下操作:
public string[] TempLines { get; set; }
...
//after the calculation code has finished
TempLines = TextBox.Split('\r');
然后你可以用 TempLines 代替价值
于 2021-08-10T14:51:06.683 回答