首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF Datagrid -DataGridTemplateColumn选项卡焦点问题

WPF Datagrid -DataGridTemplateColumn选项卡焦点问题

概述

WPF DataGrid 控件是.NET Framework 4.5版本中新增的功能,它为数据列提供了一个易于使用的界面,并支持多种样式。DataGridTemplateColumn 则是 WPF DataGrid 控件中用于定义列的类,其中的选项卡功能可以让我们在列中显示多种类型的数据。但是,在 使用 DataGridTemplateColumn 时,选项卡焦点问题是一个常见的困扰。

解决方法

以下是解决 WPF DataGrid - DataGridTemplateColumn 选项卡焦点问题的方法:

  1. 为 DataGridTemplateColumn 添加焦点策略

在 XAML 中,为 DataGridTemplateColumn 设置一个焦点策略,如 DataGridTemplateColumn.IsTabStop。例如:

代码语言:xml
复制

<DataGrid x:Name="dataGrid">

代码语言:txt
复制
   <DataGrid.Columns>
代码语言:txt
复制
       <DataGridTemplateColumn Header="Name"
代码语言:txt
复制
           CellTemplateSelector="{StaticResource cellTemplateSelector}">
代码语言:txt
复制
           <DataGridTemplateColumn.CellStyle>
代码语言:txt
复制
               <Style TargetType="DataGridCell">
代码语言:txt
复制
                   <Setter Property="IsTabStop" Value="False"/>
代码语言:txt
复制
               </Style>
代码语言:txt
复制
           </DataGridTemplateColumn.CellStyle>
代码语言:txt
复制
       </DataGridTemplateColumn>
代码语言:txt
复制
   </DataGrid.Columns>

</DataGrid>

代码语言:txt
复制

在这段代码中,我们为 DataGridTemplateColumn 设置了 IsTabStop 属性,使其在单元格中不被视为 Tab 键的停靠点。

  1. 为选项卡添加鼠标事件

可以为选项卡添加鼠标事件,以处理用户点击选项卡并切换焦点。例如:

代码语言:xml
复制

<DataGrid x:Name="dataGrid">

代码语言:txt
复制
   <DataGrid.Columns>
代码语言:txt
复制
       <DataGridTemplateColumn Header="Name">
代码语言:txt
复制
           <DataGridTemplateColumn.CellTemplate>
代码语言:txt
复制
               <DataTemplate>
代码语言:txt
复制
                   <Grid>
代码语言:txt
复制
                       <Grid.ColumnDefinitions>
代码语言:txt
复制
                           <ColumnDefinition Width="*" />
代码语言:txt
复制
                           <ColumnDefinition Width="auto" />
代码语言:txt
复制
                       </Grid.ColumnDefinitions>
代码语言:txt
复制
                       <Grid.Children>
代码语言:txt
复制
                           <telerik:RadButton x:Name="nameTab"
代码语言:txt
复制
                               Grid.Column="0"
代码语言:txt
复制
                               Margin="5"
代码语言:txt
复制
                               Padding="5"
代码语言:txt
复制
                               FontFamily="Arial"
代码语言:txt
复制
                               FontSize="14"
代码语言:txt
复制
                               ToolTipService.ShowOnDisabled="true">
代码语言:txt
复制
                               <telerik:RadButton.Content>
代码语言:txt
复制
                                   <Grid>
代码语言:txt
复制
                                       <Grid.ColumnDefinitions>
代码语言:txt
复制
                                           <ColumnDefinition Width="*" />
代码语言:txt
复制
                                           <ColumnDefinition Width="auto" />
代码语言:txt
复制
                                       </Grid.ColumnDefinitions>
代码语言:txt
复制
                                       <Grid.Children>
代码语言:txt
复制
                                           <telerik:RadButton x:Name="nameLabel"
代码语言:txt
复制
                                               Grid.Column="0"
代码语言:txt
复制
                                               Margin="5,0,0,0"
代码语言:txt
复制
                                               Padding="0"
代码语言:txt
复制
                                               FontFamily="Arial"
代码语言:txt
复制
                                               FontSize="14"
代码语言:txt
复制
                                               ToolTipService.ShowOnDisabled="true">
代码语言:txt
复制
                                               <telerik:RadButton.Content>
代码语言:txt
复制
                                                   <TextBlock Text="Name" />
代码语言:txt
复制
                                               </telerik:RadButton.Content>
代码语言:txt
复制
                                           </telerik:RadButton>
代码语言:txt
复制
                                           <telerik:RadButton x:Name="nameInput"
代码语言:txt
复制
                                               Grid.Column="1"
代码语言:txt
复制
                                               Margin="5,0,0,0"
代码语言:txt
复制
                                               Padding="0"
代码语言:txt
复制
                                               FontFamily="Arial"
代码语言:txt
复制
                                               FontSize="14"
代码语言:txt
复制
                                               ToolTipService.ShowOnDisabled="true">
代码语言:txt
复制
                                               <telerik:RadButton.Content>
代码语言:txt
复制
                                                   <TextBox x:Name="nameTextBox"
代码语言:txt
复制
                                                       Text="{Binding ElementName=dataGrid, Path=SelectedItem.Name, Mode=TwoWay}"
代码语言:txt
复制
                                                       Style="{StaticResource TextBoxStyle}"
代码语言:txt
复制
                                                       Width="100" />
代码语言:txt
复制
                                               </telerik:RadButton.Content>
代码语言:txt
复制
                                           </telerik:RadButton>
代码语言:txt
复制
                                       </Grid.Children>
代码语言:txt
复制
                                   </Grid>
代码语言:txt
复制
                               </telerik:RadButton.Content>
代码语言:txt
复制
                           </telerik:RadButton>
代码语言:txt
复制
                       </Grid.Children>
代码语言:txt
复制
                   </Grid>
代码语言:txt
复制
               </DataTemplate>
代码语言:txt
复制
           </DataGridTemplateColumn.CellTemplate>
代码语言:txt
复制
       </DataGridTemplateColumn>
代码语言:txt
复制
   </DataGrid.Columns>

</DataGrid>

代码语言:txt
复制

在这段代码中,我们为 RadButton 控件设置了 ToolTipService.ShowOnDisabled 属性,以在禁用时显示 ToolTip。

  1. 使用 DataGridTemplateColumn 的 CellTemplateSelector 属性选择模板

在 XAML 中,设置 DataGridTemplateColumn.CellTemplateSelector 属性以选择用于单元格中数据的模板。例如:

代码语言:xml
复制

<

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# WPF数据绑定方法以及重写数据模板后数据绑定

写在前面 本文将会介绍WPF如何实现前后端数据绑定和在进行数据绑定时常用的方法和类以及对于DataGrid、ListView这样的控件重写数据模板后控件如何进行数据绑定。...如果您是C#及WPF的资深开发人员本文可能对您没有太大的帮助,但如果你是一个正在学习和了解C#、WPF的开发人员来说本文可以帮助你认识MVVM设计模式和数据绑定。...> 26 27 33 34 35 </DataGrid...这种双向绑定也是MVVM设计模式的一大特点,本实例中可以看到修改了小明的名字后,修改的内容在你没有进行任何操作的情况下自动同步到了后台的数据源中(值得注意的是这里需要让选中的cell失去焦点修改的内容才会同步到后台数据源

42540

XAML常用控件2

wpf和WinForm中XY轴的定义是一样的,都是从程序的左上角作为原点,原点到右上角这一条线是X轴,原点到左下角这一条线是Y轴。...控件 这个控件就是一个表格,跟数据库中的表是类似的,并且它的职责就是用来显示数据库中的数据,下面先看个实例代码: 该控件同样是使用ItemsSource来绑定数据,...我们使用该控件时要先通过DataGrid.Columns来定义列的数量及类型,微软已经为我们定义了上述代码中所示的文本,选择框,下拉框,超链接四个常用列类型,根据业务需求,我们也可以通过DataGridTemplateColumn...对于该控件的使用,后期会详细通过代码体现,如果有任何控件使用上的问题,您尽可以来垂询。

2.3K30

WPF 触屏事件后触发鼠标事件的问题DataGrid 误触问题

WPF 触屏事件后触发鼠标事件的问题DataGrid 误触问题 目录 一、触屏事件连带触发鼠标事件的问题 二、DataGrid 误触问题及解决方法 独立观察员 2021 年 10 月 10 日 一、...触屏事件连带触发鼠标事件的问题 这个是 WPF 已知的问题,网络上也有一些讨论,但是没有一个完美的方法来解决。...注意,本文将在上篇文章《WPF DataGrid 通过自定义表头模拟首行固定》的示例程序基础上进行演示,建议先看看那篇文章。下面开始改造。...然而,本次我实际上是要解决一个 DataGrid 表格在触屏下的误触问题,相关业务逻辑是在行改变事件(转为命令了)中的,本来是没有写 PreviewTouchDown 和 PreviewMouseDown...另外,之前说过弹窗点击是的情况下,后续没有误触现象,所以也有理由怀疑是从代码中改变了选中项(已绑定到 DataGrid 的选中项)所以会有这个问题

2.5K10

WPF DataGrid 通过自定义表头模拟首行固定

WPF DataGrid 通过自定义表头模拟首行固定 独立观察员 2021 年 9 月 25 日 最近工作中要在 WPF 中做个表格,自然首选就是 DataGrid 控件了。...问题是,UI 设计的表格是在首行有一个新增按钮,那一行样式和其它数据行是一样的,就在表头下面那行。...最后就是表格控件 DataGrid 了,使用了上面这些资源,默认使用的是普通表头样式,所以普通列就不用特地指定样式了。...最后来看 DataGrid 表格的列集合,每列都是 DataGridTemplateColumn 类型。...前面也说过 DataGrid 指定了普通表头样式作为默认的表头样式,所以普通列就不用额外设置了,而且由于内容简单,所以直接使用 Header 属性设置表头内容(列标题)。

2.2K10

C++CLI 中创建WPF项目的方法探索

C++/CLI中创建WPF项目的方法 `C++/CLI`下创建WPF项目的方法 C++/CLI下创建WPF项目的方法 Visual C++中创建WPF项目的方法 由于WPF不仅仅支持C#/VB开发,还支持其他语言...进入控制面板,找到 Visual Studio 2019,右击"修改",然后切换到"独立组件"(Individual components)这个选项卡。 ? 如果没安装,勾选后安装一下即可。...^ grid = gcnew DataGrid(); grid->Background = Brushes::LightBlue; grid->Width = 80; grid->Height =...如果出现VCRUNTIME140.dll missing的问题,安装一下Visual C++ Redistributable for Visual Studio 2015 和 Microsoft Visual...大白今天躺坑完毕,总算解决了问题,先酱~ 第一个版本代码已上传到 github: https://github.com/yanglr/CppWpfDemo/tree/master/CppWpfDemo/

2K10

dotnet 7 WPF 破坏性改动 按下 F3 让 DataGrid 自动排序

本文记录在 dotnet 7 下的 WPF 的一个破坏性改动。在 dotnet 7 下的 WPF 支持 DataGrid 在按下 F3 键的时候,自动按照当前所选列进行列自动排序。...: https://github.com/dotnet/wpf/pull/6873 行为上就是在 DataGrid 获取选中和键盘焦点时,按下 F3 键,将会根据当前选中的列作为排序依据,进行排序。...F3 键,啥都没有发生 这就是 dotnet 7 在 WPF 引入的一个破坏性变更 如果不想要此功能,可以自己通过路由事件吃掉 F3 键,从而不让 DataGrid 排序 protected...更多请看 Wpf DataGrid in .NET7 takes away F3 and automatically sorts. - Breaking change. · Issue #7288 ·...dotnet/wpf 我认为在 WPF 这么大的体量下,功能性改动,还是需要谨慎一些的,毕竟众口难调。

71720

WPF 可获得焦点属性

本文来告诉大家 WPF 的可获得焦点属性,如果希望一个元素可以获得键盘输入,那么就需要一个元素是可以获得焦点,而且焦点就在元素上。...WPF 的可获得焦点元素是 Focusable,这个属性是所有继承 IInputElement 的类都有,也就是所有的 UIElement 都可以设置 Focusable ,如果一个元素设置了 Focusable...如果需要获得键盘输入,就需要焦点在这个元素,很多时候在鼠标点击的元素就自动设置焦点是这个元素,但是如果这个元素Focusable = false就不会设置焦点。...默认的属性 如果反编译 WPF 可以看到默认的值是 false ,但不是所有的控件都是 false ,下面我来告诉大家哪些控件默认是 false ,哪些是 true,方便大家快速去查元素 ?...默认是 true 的类 Button Calendar ComboBox DataGrid DatePicker ListBox RichTextBox Slider TabControl TextBox

4.4K31

WPF 可获得焦点属性

本文来告诉大家 WPF 的可获得焦点属性,如果希望一个元素可以获得键盘输入,那么就需要一个元素是可以获得焦点,而且焦点就在元素上。...WPF 的可获得焦点元素是 Focusable,这个属性是所有继承 IInputElement 的类都有,也就是所有的 UIElement 都可以设置 Focusable ,如果一个元素设置了 Focusable...如果需要获得键盘输入,就需要焦点在这个元素,很多时候在鼠标点击的元素就自动设置焦点是这个元素,但是如果这个元素Focusable = false就不会设置焦点。...默认的属性 如果反编译 WPF 可以看到默认的值是 false ,但不是所有的控件都是 false ,下面我来告诉大家哪些控件默认是 false ,哪些是 true,方便大家快速去查元素 默认是 true...的类 Button Calendar ComboBox DataGrid DatePicker ListBox RichTextBox Slider TabControl TextBox TreeView

1.4K10

WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因

WPF 中,你可以使用 Command="{Binding WalterlvCommand}" 的方式来让 XAML 中的一个按钮或其他控件绑定一个命令。...如何手动刷新命令 调用以下代码,即可让 WPF 中的命令刷新其可用性: 1 CommandManager.InvalidateRequerySuggested(); WPF 的命令在何时刷新?...在鼠标的左键或者右键松开的时候 在任何一个控件获得键盘焦点或者失去键盘焦点的时候 这部分的代码可以在这里查看: CommandDevice.PostProcessInput 最关键的代码贴在这里: 1...Tracker.DecreaseRepeatButton) 在 DataGridCell 的只读属性改变的时候(参见 DataGridCell.OnNotifyIsReadOnlyChanged) 在 DataGrid...中的各种各样的操作中(参见 DataGrid) 在 JournalNavigationScope 向后导航的时候(参见 JournalNavigationScope.OnBackForwardStateChange

60230

盘点7个开源WPF控件

1、一个可拖拉实现列表排序的WPF开源控件 项目简介 gong-wpf-dragdrop是一个开源的.NET项目,用于在WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。...支持控件有:ListBox、ListView、TreeView和DataGrid、及其他ItemsControl。...3、一套包含16个WPF控件的套件 项目简介 这是基于WPF开发的,为开发人员提供了一组方便使用自定义组件,并提供了各种常用的示例。...4、可托拉拽的WPF选项卡控件,强大好用! 项目简介 这是一个基于WPF开发的,可扩展、高度可定制、轻量级的UI组件,支持拖拉拽功能,可以让开发人员快速实现需要选项卡窗口的系统。...控件核心功能 1、工作簿:支持多工作表、工作表选项卡控件; 2、工作表:支持合并、取消合并、单元格编辑、数据格式、自定义单元格、填充数据序列、单元格文本旋转、富文本、剪贴板、下拉列表单元格、边框、样式、

41120

【我们一起写框架】MVVM的WPF框架(三)—数据控件

DataControl—数据控件 上文我们已经编写出来了WPF的MVVM基础框架,但为了让他更加强壮,为了让他多坚持一阵子再粉碎,我们要让ViewModel更强壮,所以我们要编写[数据控件]。...因为WPF里的控件大多继承自Control,所以我们先创建Control的数据控件。...:TextChangeCallBack委托与TextChanged事件不同,并不是每次修改文字都会触发,而是当TextBox的Text内容真正被修改时,才会触发;我们可以简单的理解为TextBox失去焦点时才会触发...因为DataGrid数据控件是所有数据控件中最复杂的,而且代码量特别多;所以,我决定,单拿出一篇来介绍DataGrid。 框架代码已经传到Github上了,并且会持续更新。...相关文章: 【我们一起写框架】MVVM的WPF框架(一)—序篇 【我们一起写框架】MVVM的WPF框架(二)—绑定 To be continued——DataGrid Github地址:https://

2.3K30

如何让 WPF 程序更好地适配 UI 自动化

CheckBox 检查框 combobox ComboBox 组合框 custom UserControl 自定义控件 datagrid DataGrid 数据表 dataitem DataItem...Separator 分隔符 slider Slider 滑块 spinner 旋转器 splitbutton 拆分按钮 statusbar StatusBar 状态栏 tab TabControl 选项卡...tabitem TabItem 选项卡项 table 表格 text TextBlock 文本 thumb Thumb titlebar 标题栏 toolbar ToolBar 工具栏 tooltip...WPF 自带控件的支持情况 为了直观地看到 WPF 每个自带控件对 UI 自动化的支持情况,我给刚刚创建的 WPF 程序添加了各种常见控件,然后用自己写的 UI 自动化测试软件捕获一下这个窗口。...如果你设置了控件的内容(例如按钮/复选框/单选框/列表项的 Content,例如菜单项/选项卡的 Header),那么 UI 自动化在捕获到此控件后,其自动化 Name 就是对应指定的这些属性。

33420
领券