c# – 在未选中的行中单击未在WPF Datagrid中触发的事件

c# – 在未选中的行中单击未在WPF Datagrid中触发的事件,第1张

概述我有一个像这样的DataGrid( WPF 4): <DataGrid Margin="0,0,0,5" VerticalAlignment="Top" Height="192" BorderBrush="#aaa" Background="White" HorizontalAl 我有一个像这样的DataGrID( WPF 4):
<DataGrID   margin="0,5" VerticalAlignment="top" Height="192"                             borderBrush="#aaa" Background="White"                             HorizontalAlignment="left"                             ItemsSource="{Binding namen,Mode=OneWay}"                             ScrollVIEwer.VerticalScrollbarVisibility="Visible"                            autoGenerateColumns="False"                             ColumnheaderHeight="24"                             SelectionChanged="DataGrIDAuslaendischeAltenamen_SelectionChanged">                    <DataGrID.Columns>                        <DataGrIDTextColumn WIDth="*" header="namenseintrag" Binding="{Binding displayname,Mode=OneWay}" />                        <DataGrIDTextColumn WIDth="75" header="gültig von" Binding="{Binding GueltigAb,StringFormat=d,Mode=OneWay}" />                        <DataGrIDTextColumn WIDth="75" header="gültig bis" Binding="{Binding GueltigBis,StringFormat=d.,Mode=OneWay}" />                        <DataGrIDTemplateColumn WIDth="20" IsReadonly="True">                            <DataGrIDTemplateColumn.CellTemplate>                                <DataTemplate>                                    <button Style="{DynamicResource CaratRemovebutton}"                                             Click="button_Click" CommandParameter="{Binding}"                                             PrevIEwMouseDown="button_PrevIEwMouseDown"                                             />                                </DataTemplate>                            </DataGrIDTemplateColumn.CellTemplate>                        </DataGrIDTemplateColumn>                </DataGrID.Columns>                </DataGrID>

我遇到的问题是,如果未选中其行,则DataGrIDTemplateColumn的按钮不会触发click事件.所以我必须两次单击一个按钮,一次选择它的行然后再提高click事件.
我读过有关复选框列的类似问题,但显然建议使用模板列.
我测试使用按钮的PrevIEwMouseDown-Event,它有效,但不是我想要的,因为那时按钮不遵循其通常的grpahical点击行为.

我在这里错过了什么?无论是否选择了行,如何只需单击一次即可获得该单击事件?

解决方法 基本上,除了使用TemplateColumn并自己管理每个mouseEvent之外,你没有解决方案.

说明:

click = mouseDown MouseUp,对.
所以你的按钮需要能够获得mouseDown MouseUp事件.

但…

默认情况下,wpf的DataGrID的行处理MouseDown事件,以便选择你执行mouseDown的那一行(确认:单元格上的mouseDown并按住mousebutton,你会看到在释放之前选择了行按钮).

所以基本上,MouseDownEvent在到达按钮之前处理,阻止你能够使用按钮上的Click事件

微软在他们的文档中告诉我们,在这种情况下,我们应该转向预览类型的事件,但这不适用于click事件,因为你无法拥有prevIEwClickEvent

因此,我能看到的唯一解决方案是在按钮上同时监听PrevIEwMouseDown和PrevIEwMouseUp,并自己模拟一下它们的点击

有点像这样的东西:

button mybutton = new button();bool mouseleftbuttonDownOnMybutton;mybutton.PrevIEwMouseleftbuttonDown += (s,e) => { mouseleftbuttonDownOnMybutton = true; };mybutton.PrevIEwMouseleftbuttonUp += (s,e) => {    if (mouseleftbuttonDownOnMybutton)        mybutton.RaiseEvent( new RoutedEventArgs(button.ClickEvent,mybutton));        mouseleftbuttonDownOnMybutton = false;    };mybutton.Click += mybuttonClickHandler;

(当然,你需要在你的xaml模板中翻译它)

注意:这还不完整,你还应该注意用户在按钮上执行mouseDown但在执行mouseup之前将鼠标移出按钮的情况(在这种情况下你应该重置mouseleftbuttonDownOnMybutton标志).最好的方法可能是重置一般mouseUpEvent(例如在窗口级别)而不是按钮的标志.

编辑:上面的代码也允许您管理Click事件,并且只有一个代码用于实际和模拟的点击事件(因此使用RaiseEvent方法),但是如果你不需要这个,你可以直接把你的当然,还有PrevIEwMouseUp部分中的代码.

总结

以上是内存溢出为你收集整理的c# – 在未选中的行中单击未在WPF Datagrid中触发的事件全部内容,希望文章能够帮你解决c# – 在未选中的行中单击未在WPF Datagrid中触发的事件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1247752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存