无法处理ListView项(标签)的MouseDown事件

问题描述 投票:0回答:2

我有一个列表视图,我通过代码填充标签。当用户单击标签时,我想处理 MouseDown 事件,但它不会触发。按下预览鼠标确实会触发。

我知道这里有一些关于路由/冒泡事件的内容,我想这会解决我遇到的问题,这是一个我尚未掌握的概念。

我无法使用预览事件,因为它不包含我需要的对象(直到第二次单击标签时才会分配标签信息,因此我假设我需要 MouseDown 而不是预览)

珍惜您的时间。

XAML

 <telerik:RadTabItem x:Name="Media" Header="Media" Height="22" Width="100">
                <Grid x:Name="ListboxMedia">


                    <ListView x:Name="ListViewImages" HorizontalAlignment="Left" Height="303" Margin="697,10,0,0" VerticalAlignment="Top" Width="178" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" IsTabStop="True" TabIndex="3" MouseDown="ListViewImages_MouseDown" PreviewMouseDown="ListViewImages_PreviewMouseDown">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn x:Name="ListViewImageColumn" Header="Images" Width="178" />
                            </GridView>
                        </ListView.View>
                    </ListView>

                    <Button x:Name="BtnUpload" Content="Upload" Height="24" Margin="809,318,38,0" VerticalAlignment="Top" Click="BtnUpload_Click"/>
                    <Button x:Name="BtnDownload" Content="Download" Height="24" Margin="728,318,109,0" VerticalAlignment="Top"/>
                    <Image x:Name="ImageViewPort" HorizontalAlignment="Left" Height="293" Margin="21,20,0,0" VerticalAlignment="Top" Width="581"/>
                </Grid>

            </telerik:RadTabItem>

将标签填充到ListViewImages中的方法

 void PopulateMedia()
        {
            var collectImages = new Media().CollectMediaForAsset(_assetId);

            int i = 1;

            foreach (var collectImage in collectImages)
            {
                var label = new Label();
                label.Tag = collectImage.FileName;
                label.Content = "Image" + i.ToString();
                ListViewImages.Items.Add(label);                
                i++;
            }
        }

处理程序

 private void ListViewImages_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            Debug.WriteLine("Clicked Down"); //does not work


        }

        private void ListViewImages_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            Debug.WriteLine("Clicked Preview"); //works


        }
c# wpf events
2个回答
0
投票

TLDR

我们可以使用 ListViewItem PreviewMouseDown 或 ListView SelectionChanged

说明

当我尝试使用 ListViewItem 中的 MouseDown 事件时,我遇到了困难。

WPF 的强大工具,Snoop,允许监视哪个控件消耗鼠标事件。感谢我能够发现这是 ListViewItem: Tracking MouseDown event using Snoop

查看PresentationFramework的源代码,看来ListViewItem的实现方式是这样的:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    if (!e.Handled)
    {
        // 
        e.Handled = true;
        HandleMouseButtonDown(MouseButton.Left);
    }
    base.OnMouseLeftButtonDown(e);
}

-2
投票

使用选择更改事件来代替

© www.soinside.com 2019 - 2024. All rights reserved.