上图中红色框区域是一个自定义的ListBox控件,需要实现的功能是,点击红框区域中某项时,获取当前选中项的数据项

控件的MouseDown事件部分代码为:

 var x = TreeHelper.FindPointProperty<ListBoxItem>(this, scrollStartPoint);
if (x != null)
{
x.IsSelected = true;
ItemsControl tiles = ItemsControl.ItemsControlFromItemContainer(x);
var data = tiles.ItemContainerGenerator.ItemFromContainer(x);
if (data != null && data is DummyTileData)
{
tile = (DummyTileData)data;
}
}

TreeHelper部分代码:对树结构进行操作,获取指定类型(ListBoxItem)元素

 /// <summary>
/// 找到一个父一个给定的项目视觉上的树。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="child"></param>
/// <returns></returns>
public static T TryFindParent<T>(this DependencyObject child) where T : DependencyObject
{ DependencyObject parentObject = GetParentObject(child);
if (parentObject == null) return null;
T parent = parentObject as T;
if (parent != null)
{
return parent;
}
else
{
return TryFindParent<T>(parentObject);
}
} public static DependencyObject GetParentObject(this DependencyObject child)
{
if (child == null) return null; //判断child为ContentElement
ContentElement contentElement = child as ContentElement;
if (contentElement != null)
{
DependencyObject parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent; FrameworkContentElement fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
} //也尝试寻找父框架元素(如DockPanel中,等)
FrameworkElement frameworkElement = child as FrameworkElement;
if (frameworkElement != null)
{
DependencyObject parent = frameworkElement.Parent;
if (parent != null) return parent;
} //如果child不是一个ContentElement/ FrameworkElement,运行VisualTreeHelper
return VisualTreeHelper.GetParent(child);
} public static T FindPointProperty<T>(UIElement reference, Point point) where T : DependencyObject
{
DependencyObject element = reference.InputHitTest(point) as DependencyObject; if (element == null) return null;
else if (element is T) return (T)element;
else return TryFindParent<T>(element);
}

reference.InputHitTest(point) 返回指定坐标上的当前元素中的输入元素(相对于当前元素的源)。下图为点击ListBox控件时,鼠标点击坐标的获取到一个的输出元素 当前获取到的是Border元素

通过获取到的元素,依次查找类型为ListBoxItem 我们需要的对象

TreeHelper.FindPointProperty<ListBoxItem>(this, scrollStartPoint); 这段代码是发现对象当前坐标的ListBoxItem项

接下来有两个属性:

//返回拥有指定容器元素的 System.Windows.Controls.ItemsControl。参数:container:要为其返回 System.Windows.Controls.ItemsControl 的容器元素。返回: 拥有指定容器元素的 System.Windows.Controls.ItemsControl。

public static ItemsControl ItemsControlFromItemContainer(DependencyObject container);

ItemContainerGenerator类下面的:返回对应于指定生成的 System.Windows.UIElement 的项。参数: container:对应于要返回的项的 System.Windows.DependencyObject。

public object ItemFromContainer(DependencyObject container);

WPF中获取指定坐标依赖对象数据项的更多相关文章

  1. 在 WPF 中获取一个依赖对象的所有依赖项属性

    原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...

  2. 如何在 WPF 中获取所有已经显式赋过值的依赖项属性

    原文:如何在 WPF 中获取所有已经显式赋过值的依赖项属性 获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取.这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的.有什么方法可以获 ...

  3. WPF 中获取DataGrid 模板列中控件的对像

    WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...

  4. WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

    原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章介绍在WPF中实现PropertyGr ...

  5. Spring中获取被代理的对象

    目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...

  6. jquery中获取当前点击对象

    jquery中获取当前点击对象的简单方法就是,在点击事件click中传入event对象 click(function(event)); 调用当前对象就是$(event.target);

  7. java 从spring容器中获取注入的bean对象

      java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...

  8. SpringMvc4中获取request、response对象的方法

    springMVC4中获取request和response对象有以下两种简单易用的方法: 1.在control层获取 在control层中获取HttpServletRequest和HttpServle ...

  9. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

随机推荐

  1. 什么是AWS Lambda?——事件驱动的函数执行环境

    AWS CTO Werner Vogels在AWS re:Invent 2014大会的第二场主题演讲上公布了两个新服务和一系列新的实例,两个新服务都相当令人瞩目:第一个宣布的新服务是Amazon EC ...

  2. hdu-4990 Reading comprehension(快速幂+乘法逆元)

    题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K ( ...

  3. 「USACO13MAR」「LuoguP3080」 牛跑The Cow Run (区间dp

    题目描述 Farmer John has forgotten to repair a hole in the fence on his farm, and his N cows (1 <= N ...

  4. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  5. JS-React:目录

    ylbtech-JS-React:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbt ...

  6. bzoj4804

    莫比乌斯反演 我不会推线性筛 留坑

  7. Java中的双重检查(Double-Check)详解

    在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...

  8. Word2013 在一个页面双列显示

    1. 效果图 2. 实现方法 (1) 进入页面布局 (2) 选中要整理的字,选中Columns,然后选择Two

  9. java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误

    一般是jar包冲突,或者某些jar包版本不同. 如上,spring其他包的版本均为4.2.5,而spring-webmvc的jar包为1.2.6版本,造成版本冲突. 把该包版本改为4.2.5,宣告成功 ...

  10. OpenWrt路由器通过iPhone有线共享网络上网

    2018年4月更新: 我自己的手机在openwrt上网速很慢,在电脑上又很快.应该不是被限速了,但是没找到原因. 三大运营商在学校争客户,手机卡开出了校内无限流量的条件.很开心,之前准备到东北大学的时 ...