Wpf 当DataGridTemplateColumn中的编辑文本框收到焦点时,如何选择所有文本?
我试图使DataGridTemplateColumn的行为与TextColumn相同Wpf 当DataGridTemplateColumn中的编辑文本框收到焦点时,如何选择所有文本?,wpf,datagrid,wpftoolkit,wpf-4.0,Wpf,Datagrid,Wpftoolkit,Wpf 4.0,我试图使DataGridTemplateColumn的行为与TextColumn相同 当单元格进入编辑模式(按F2键)时,用户可以立即开始键入新值 默认情况下,将选择现有文本内容-以便您可以轻松设置新值 完成了第一个任务;但是,选择所有文本不起作用。正如许多帖子所提到的,他们尝试连接到GotFocus事件并选择代码隐藏中的所有文本。这适用于独立的文本框;但是,对于TemplateColumn的编辑控件Textbox,这不起作用 有什么想法吗? 代码示例: <Window.Resourc
- 当单元格进入编辑模式(按F2键)时,用户可以立即开始键入新值
- 默认情况下,将选择现有文本内容-以便您可以轻松设置新值
<Window.Resources>
<Style x:Key="HighlightTextBoxStyle" TargetType="{x:Type TextBox}">
<EventSetter Event="GotFocus" Handler="SelectAllText"/>
<EventSetter Event="GotMouseCapture" Handler="SelectAllText"/>
<Setter Property="Background" Value="AliceBlue"/>
</Style>
<DataTemplate x:Key="DefaultTitleTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
<DataTemplate x:Key="EditTitleTemplate">
<TextBox x:Name="Fox"
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
Text="{Binding Path=Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource HighlightTextBoxStyle}">
</TextBox>
</DataTemplate>
</Window.Resources>
<DockPanel>
<TextBox DockPanel.Dock="Top" x:Name="Test" Text="{Binding Path=(FocusManager.FocusedElement).Name, ElementName=MyWindow}"
Style="{StaticResource HighlightTextBoxStyle}"/>
<toolkit:DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<toolkit:DataGrid.Columns>
<toolkit:DataGridTemplateColumn Header="Templated Title"
CellTemplate="{StaticResource DefaultTitleTemplate}"
CellEditingTemplate="{StaticResource EditTitleTemplate}" />
<toolkit:DataGridTextColumn Header="Title" Binding="{Binding Path=Title}" />
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
</DockPanel>
未能更新带有答案的帖子 问题似乎在于,对于自定义数据网格列(也称为DataGridTemplateColumn),网格无法知道编辑控件的确切类型(通过DataTemplate指定,可以是任何类型)。对于DataGridTextColumn,编辑控件类型是已知的,因此网格可以找到它并在其中调用SelectAll() 因此,为了实现TemplateColumn的最终目标,您需要提供帮助。我忘了第一次是怎么解决的。。但这里有一些我今天搜索到的东西使用如下所示的PrepareCellForEdit方法的重写创建模板列的自定义派生(使用精确的编辑控件交换文本框)。
public class MyCustomDataColumn : DataGridTemplateColumn
{
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
var contentPresenter = editingElement as ContentPresenter;
var editingControl = FindVisualChild<TextBox>(contentPresenter);
if (editingControl == null)
return null;
editingControl.SelectAll();
return null;
}
private static childItem FindVisualChild<childItem>(DependencyObject obj)
}
公共类MyCustomDataColumn:DataGridTemplateColumn
{
受保护的覆盖对象PrepareCellForEdit(FrameworkElement editingElement、RoutedEventTargets editingEventArgs)
{
var contentPresenter=editingElement作为contentPresenter;
var editingControl=FindVisualChild(contentPresenter);
if(editingControl==null)
返回null;
editingControl.SelectAll();
返回null;
}
私有静态子项FindVisualChild(DependencyObject obj)
}
给你
XAML:
大量代码用于处理恼人的不一致性。我知道这已经太晚了,但我采取了不同的方法,创造性地扩展了TextBox类。我真的不喜欢使用布尔值来检查文本是否已经定义,但问题是选择事件在从绑定设置文本之前都会触发,因此SelectAll()没有任何可选择的内容!该类可能仅在DataGridTemplateColumn之类的内容中用作编辑模板。我为这个问题找到的每一个解决方案都几乎是一个黑客行为,所以我对这个问题并不感到太糟糕……:)
据我所知,这个问题仍然没有解决。@Dabblernl-试试下面的管道胶带补丁是否有效。对不起,现在给你奖金已经太迟了。非常感谢@Dabblernl-在我遇到Skeet先生之后,我停止了追逐rep。朋友:)很乐意帮忙。在我的情况下,我还必须将焦点设置为编辑文本框
editingControl.focus()代码>editingControl.SelectAll()代码>
<WPFTestBed:MyCustomDataColumn Header="CustomColumn"
CellTemplate="{StaticResource DefaultTitleTemplate}"
CellEditingTemplate="{StaticResource EditTitleTemplate}"/>
</DataGrid.Columns>
class AutoSelectTextBox : TextBox
{
private bool _autoSelectAll= true;
protected override void OnInitialized(EventArgs e)
{
// This will cause the cursor to enter the text box ready to
// type even when there is no content.
Focus();
base.OnInitialized(e);
}
protected override OnKeyDown(System.Windows.Input.KeyEventArgs e)
{
// This is here to handle the case of an empty text box. If
// omitted then the first character would be auto selected when
// the user starts typing.
_autoSelectAll = false;
base.OnKeyDown(e);
}
protected override void OnTextChanged(TextChangedEventArgs e)
{
if (_autoSelectAll)
{
SelectAll();
Focus();
_autoSelectAll= false;
}
base.OnTextChanged(e);
}
}