列表视图MouseDoubleClickEvent创造背后code [英] Listview MouseDoubleClickEvent create in behind code
问题描述
当我有:
< UserControl.Resources> <风格X:键=itemstyle的TargetType ={X:类型的ListViewItem}>
< EventSetter事件=MouseDoubleClick处理器=HandleDoubleClick/>
< setter属性=HorizontalContentAlignmentVALUE =中心/>
< /样式和GT;
< /UserControl.Resources>
<网格和GT;
< ListView控件ItemContainerStyle =itemstyleNAME =ListView1的>
< ListView.View>
<&GridView的GT;
...等
后面
code
保护无效HandleDoubleClick(对象发件人,MouseButtonEventArgs E)
{
ŧ项目=(T)(((的ListViewItem)发送方).Content);
//产品被双点击该行项目
}
一切都很正常。
现在我需要做同样的事情在code后面。这是我工作过的:
公共构造函数(){ listview.AddHandler(
ListViewItem.MouseDoubleClickEvent,
新MouseButtonEventHandler(HandleDoubleClick)
);
}
保护无效HandleDoubleClick(对象发件人,MouseButtonEventArgs E)
{
ŧ项目=(T)(((的ListViewItem)发送方).Content);
//错误导致发件人列表视图
}
这是事件触发,当我双击列表视图不只是一个ListViewItem的任何部分。此外,我希望发件人是ListViewItem的,它不是。发件人实际上是列表视图。我已经试过的东西:
1)由于发件人是我试图创建事件的列表视图为:
块引用>listview.AddHandler(
//我用的,因为方法previewMouseDoubleClickEvent而不是MouseDoubleClickEvent事件bubles
ListViewItem的。previewMouseDoubleClickEvent,
新MouseButtonEventHandler(HandleDoubleClick)
);我得到同样的错误发件人列表视图
2),而不是做的:
块引用>T项目=(T)((的ListViewItem)发送方).Content;
我做的:
T项目=(T)(listview.selectedItem);
这个问题是,如果在列表视图用户双击任何不属于该行会返回当前选定的项目
为什么我的code不工作?我究竟做错了什么?
解决方案看着办吧!我相信这应该与双击...
相同在XAML我有:
< ListView控件IsSynchronizedWithCurrentItem =真NAME =ListView的保证金=32,158,66,0VerticalAlignment =评出的>
< ListView.ItemContainerStyle>
<风格的TargetType =ListViewItem的>
< EventSetter事件=previewMouseUp处理器=itemClicked>< / EventSetter>
< /样式和GT;
< /ListView.ItemContainerStyle>
< ListView.View>
...等和我可以code创建C#一样的东西后面为:
EventSetter EV =新EventSetter();
。ev.Event = ListViewItem的previewMouseUpEvent;
ev.Handler =新MouseButtonEventHandler(itemClicked); 风格myStyle的=新样式();
myStyle.TargetType = typeof运算(ListViewItem的); myStyle.Setters.Add(EV);
listView.ItemContainerStyle = myStyle的;...
无效itemClicked(对象发件人,MouseButtonEventArgs E)
{
//项目在列表视图舔这里实施的行为
}When I have:
<UserControl.Resources> <Style x:Key="itemstyle" TargetType="{x:Type ListViewItem}"> <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" /> <Setter Property="HorizontalContentAlignment" Value="Center" /> </Style> </UserControl.Resources> <Grid> <ListView ItemContainerStyle="itemstyle" Name="listView1" > <ListView.View> <GridView> ... etc
Code behind
protected void HandleDoubleClick(object sender, MouseButtonEventArgs e) { T item = (T)(((ListViewItem)sender).Content); // item is the row item that was double clicked on }
Everything works great.
Now I need to do the same thing on code behind. This is what I have worked out:
public Constructor(){ listview.AddHandler( ListViewItem.MouseDoubleClickEvent, new MouseButtonEventHandler(HandleDoubleClick) ); } protected void HandleDoubleClick(object sender, MouseButtonEventArgs e) { T item = (T)(((ListViewItem)sender).Content); // error cause the sender is the listview }
that event fires when I double click any part of the listview not just the listviewItem. Also I expect sender to be ListViewItem and it is not. the sender is actually the listview. Things that I have tried:
1) Because the sender is the listview I tried creating the event as:
listview.AddHandler( // I use PreviewMouseDoubleClickEvent instead of MouseDoubleClickEvent because of the way the events bubles ListViewItem.PreviewMouseDoubleClickEvent, new MouseButtonEventHandler(HandleDoubleClick) );
I get the same error the sender is the listview
2) Instead of doing:
T item = (T)((ListViewItem)sender).Content;
I do:
T item = (T)(listview.selectedItem);
the problem with this is that if the user double clicks anything on the listview that is not the row it will return the current selected item
why is my code not working? what am I doing wrong?
解决方案Figure it out!! I am sure it should be the same with the double click...
In xaml I have:
<ListView IsSynchronizedWithCurrentItem="True" Name="listView" Margin="32,158,66,0" VerticalAlignment="Top"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <EventSetter Event="PreviewMouseUp" Handler="itemClicked"></EventSetter> </Style> </ListView.ItemContainerStyle> <ListView.View> ... etc
and I can create the same thing with c# on code behind as:
EventSetter ev = new EventSetter(); ev.Event = ListViewItem.PreviewMouseUpEvent; ev.Handler = new MouseButtonEventHandler(itemClicked); Style myStyle = new Style(); myStyle.TargetType = typeof(ListViewItem); myStyle.Setters.Add(ev); listView.ItemContainerStyle = myStyle;
....
void itemClicked(object sender, MouseButtonEventArgs e) { // item was licked in listview implement behavior in here }
这篇关于列表视图MouseDoubleClickEvent创造背后code的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!