gpt4 book ai didi

WPF:DataGrid如何输入多行文本

转载 作者:行者123 更新时间:2023-12-03 02:46:57 30 4
gpt4 key购买 nike

伙计们我想在DataGridTextColumn中输入多行文本,我可以使用“enter”来输入多行字符。但我想像 Visual Studio 资源管理器一样使用“shift+enter”,这是我带有“enter”键的代码。

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="AcceptsReturn" Value="true" />
</Style>
</DataGridTextColumn.EditingElementStyle>

最佳答案

实现此目的的一种方法是使用样式中的 EventSetter 处理 TextBox 上的 KeyDown 事件。我以您的示例为例,删除了样式中的 AcceptsReturn setter,并向 EditingElementStyle 添加了一个 KeyDown 处理程序,该处理程序在插入符号所在的位置添加换行符并将 CaretIndex 移动到右侧。

这是 XAML:

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap" />
<EventSetter Event="KeyDown" Handler="OnTextBoxKeyDown"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>

我在新的应用程序项目模板的 Window 类中编写了示例,因此这里是整个 Window 的 C# 以及事件处理代码。请注意,我将 Handled 设置为 true 以阻止事件在任何地方冒泡,因为在这种情况下我不希望将 Return 键处理为对编辑行的提交。我认为这实际上是该方法的缺点之一。如果您在应用程序中与用户输入进行复杂的交互,那么停止事件的冒泡/隧道很容易变成逻辑炸弹。但如果只有这样一种特殊情况,那也不算太糟糕。因此,与所有事情一样,随着使用它的 UI 部分的增长,请谨慎使用。

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new List<Thing>
{
new Thing { Value = "Some text" },
new Thing { Value = "More text" + Environment.NewLine + " second line" },
new Thing { Value = "Another value" }
};
}

private void OnTextBoxKeyDown(object sender, KeyEventArgs e)
{
if (Key.Return == e.Key &&
0 < (ModifierKeys.Shift & e.KeyboardDevice.Modifiers))
{
var tb = (TextBox)sender;
var caret = tb.CaretIndex;
tb.Text = tb.Text.Insert(caret, Environment.NewLine);
tb.CaretIndex = caret + 1;
e.Handled = true;
}
}
}

public class Thing
{
public string Value { get; set; }
}

另一件需要考虑的事情是,如果按下了插入键并且您处于覆盖输入模式,您可能希望行为有所不同。也许在这种情况下,下一个字符应该被新行替换。但 Visual Studio 2010 中的资源编辑器似乎对插入键没有反应(它也不将文本显示为多行)。但我认为鉴于这个示例,您可以扩展它以使其与插入键配合良好。希望这有帮助,祝你好运!

关于WPF:DataGrid如何输入多行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4968590/

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