Пока вы знаете, сколько строк в вашем тексте, вы можете просто использовать атрибут "rows" в TextView, как это
<textarea rows="@Rows"
@bind-value="MyText"
@bind-value:event="oninput" />
И в своем коде вы можете определить значениедля строк
Обратите внимание, я использую Math.Max (Rows, 2), чтобы сохранить минимум две строки.
private void CalculateSize(string value)
{
Rows = Math.Max(value.Split('\n').Length, value.Split('\r').Length);
Rows = Math.Max(Rows, 2);
}
Я вызываю CalculateSize из кода, который обрабатывает изменения в «MyText» -либо пользовательский установщик, подобный этому, либо метод ANOther
string _myText;
protected string MyText
{
get => _myText;
set
{
_myText = value;
CalculateSize(value);
}
}
Максимальная высота может быть легко установлена либо с помощью CSS для подхода к проектированию, либо путем добавления другого ограничения в метод CalculateSize.
private void CalculateSize(string value)
{
Rows = Math.Max(value.Split('\n').Length, value.Split('\r').Length);
Rows = Math.Max(Rows, MIN_ROWS);
Rows = Math.Min(Rows, MAX_ROWS);
}
Вариант 2
Если вы хотите простоты и не возражаете против встроенного JS (если вы этого захотите, то пришло время взломать JSInterop ....)
<textarea
rows="2"
placeholder="Sample text."
style="resize:both;"
oninput="this.style.height = 'auto'; this.style.height = (this.scrollHeight) + 'px';">
</textarea>
Вариант 3
Если вы действительно хотите использовать JSInterop, вы можете сделать что-то подобное или поместить свой код в файл JS и включить его на страницу.
<textarea id="MyTextArea"
rows="2"
placeholder="Sample text."
@oninput="Resize"></textarea>
<label>This area is @(MyHeight)px</label>
@code
{
[Inject] IJSRuntime JSRuntime { get; set; }
double MyHeight=0;
async Task Resize()
{
var result = await JSRuntime.InvokeAsync<object>("eval",@"(function() {
MyTextArea.style.height='auto';
MyTextArea.style.height=(MyTextArea.scrollHeight)+'px';
return MyTextArea.scrollHeight;
})()");
Double.TryParse(result.ToString(), out MyHeight);
}
}