列表视图MouseDoubleClickEvent创造背后code [英] Listview MouseDoubleClickEvent create in behind code

查看:234
本文介绍了列表视图MouseDoubleClickEvent创造背后code的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我有:

 < UserControl.Resources>    <风格X:键=itemstyle的TargetType ={X:类型的ListViewItem}>
        < EventSetter事件=MouseDoubleClick处理器=HandleDoubleClick/>
        < setter属性=Horizo​​ntalContentAlignmentVALUE =中心/>
    < /样式和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆