专栏首页码客WPF桌面端开发2-ItemsControl和ListBox获取点击行的索引

WPF桌面端开发2-ItemsControl和ListBox获取点击行的索引

前言

ItemsControl和ListBox都可以用做列表,既然是列表,那么我们怎样获取列表点击的项呢。

ListBox点击列表项后就不能再触发点击事件,而ItemsControl压根就没有选中项,那么怎样处理呢?

ListBox

自定义ListBox,当item选中后再重置为未选中

自定义ListBox

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace ZJClassTool.Views
{
    public class MyListBox : ListBox
    {
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new MyListBoxItem();
        }

    }
    public class MyListBoxItem : ListBoxItem
    {
        protected override void OnSelected(System.Windows.RoutedEventArgs e)
        {
            DependencyObject dep = (DependencyObject)e.OriginalSource;
            while ((dep != null) && !(dep is ListBoxItem))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            if (dep == null) { return; }


            ListBoxItem item = (ListBoxItem)dep;
            if (item.IsSelected)
            {
                item.IsSelected = !item.IsSelected;
            }
            base.OnSelected(e);
        }
    }
}

使用

<views:MyListBox 
    x:Name="toolbar_list"
    ItemsSource="{Binding menuList}"
    ItemTemplate="{StaticResource ToolbarMenu}"
    SelectionChanged="myListBox_SelectionChanged"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    Grid.Row="1" Background="#f3f3f3" BorderThickness="0">
</views:MyListBox>

对应的

private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    object o = toolbar_list.SelectedItem;
    if (o == null)
    	return;
    MessageBox.Show(o.ToString());
}

ItemsControl

Item中添加Button,对Button添加事件,获取Button所在Item的Index

工具类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;

namespace ZJClassTool.Utils
{
    class VTHelper
    {
        public static T FindChild<T>(DependencyObject parent, string childName)
   where T : DependencyObject
        {
            if (parent == null) return null;

            T foundChild = null;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                // 如果子控件不是需查找的控件类型
                T childType = child as T;
                if (childType == null)
                {
                    // 在下一级控件中递归查找
                    foundChild = FindChild<T>(child, childName);

                    // 找到控件就可以中断递归操作 
                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    // 如果控件名称符合参数条件
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    // 查找到了控件
                    foundChild = (T)child;
                    break;
                }
            }

            return foundChild;
        }

        public static List<T> FindChilds<T>(DependencyObject parent, string childName)
   where T : DependencyObject
        {
            var list = new List<T>();
            if (parent == null) return list;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                // 如果子控件不是需查找的控件类型
                T childType = child as T;
                if (childType == null)
                {
                    // 在下一级控件中递归查找
                    var findChildList = FindChilds<T>(child, childName);
                    for (int j = 0; j < findChildList.Count; j++)
                    {

                    }
                    list.AddRange(FindChilds<T>(child, childName));

                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    // 如果控件名称符合参数条件
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        list.Add((T)child);
                    }
                }
                else
                {
                    // 查找到了控件
                    list.Add((T)child);
                }
            }

            return list;
        }

        /// <summary>
        /// 查找父元素
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static T FindParent<T>(DependencyObject i_dp) where T : DependencyObject
        {
            DependencyObject dobj = VisualTreeHelper.GetParent(i_dp);
            if (dobj != null)
            {
                if (dobj is T)
                {
                    return (T)dobj;
                }
                else
                {
                    dobj = FindParent<T>(dobj);
                    if (dobj != null && dobj is T)
                    {
                        return (T)dobj;
                    }
                }
            }
            return null;
        }
    }
}

xaml

<Window.Resources>
    <DataTemplate x:Key="ToolbarMenu">
        <Button x:Name="toolbar_item"  Background="Transparent" BorderThickness="0" Cursor="Hand" Height="60" Click="toolbar_item_Click">
            <Button.Content>
                <StackPanel Width="Auto" Background="Transparent">
                    <Image HorizontalAlignment="Center" Width="44" Source="{Binding Pic}"/>
                    <TextBlock HorizontalAlignment="Center" Text="{Binding Name}" Foreground="#3C525B"/>
                </StackPanel>
            </Button.Content>
        </Button>
    </DataTemplate>
</Window.Resources>
<ItemsControl 
    x:Name="toolbar_list"
    ItemsSource="{Binding menuList}"
    ItemTemplate="{StaticResource ToolbarMenu}"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    Grid.Row="1" Background="#f3f3f3" BorderThickness="0">
</ItemsControl>

代码

private void toolbar_item_Click(object sender, RoutedEventArgs e)
{
    var clickindex = 0;
    var buttons = VTHelper.FindChilds<Button>(toolbar_list, "toolbar_item");
    for (var i = 0; i < buttons.Count; i++)
    {
        if (buttons[i] == sender)
        {
            clickindex = i;
            break;
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Freemarker常用方法

    剑行者
  • iOS地图开发1-定位(swift)

    关于ios中地图定位相关的开发可以分两块,一块为调用ios的定位获取GPS坐标以及坐标–>地址,地址–>坐标,另一块就是调用苹果对地图的封装,也可以调用高德或者...

    剑行者
  • Weex基本操作

    weex-toolkit 是官方提供的一个脚手架命令行工具,你可以使用它进行 Weex 项目的创建,调试以及打包等功能。

    剑行者
  • 小程序循环列表删除当前选中列表的方法

    需求:点击解绑按钮的时候,会删除当前所点击的列表. 点击试驾按钮的时候,左侧的图标会变成按钮一样的颜色。

    祈澈菇凉
  • 从0开始的Python学习006流程控制

    使用if语句来校验一个条件,如果条件为真(True),运行if-块,如果为假(False),运行else-块。

    Happy、Liu
  • Python的控制流

        if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 )。 else 从句...

    py3study
  • Python基础一

    changxin7
  • 【每天学点Python】案例六:判断密码

    py3study
  • python如何学习(三)

    说明:该示例程序仅为演示多层if-else的语法结构,程序本身的设计存在漏洞;空格缩进在pycharm IDE环境中会被自动处理,但在普通文件编辑器中需要手动设...

    py3study
  • Python 基本语句

    首先申明下,本文为笔者学习《Python学习手册》的笔记,并加入笔者自己的理解和归纳总结。

    py3study

扫码关注云+社区

领取腾讯云代金券