上图中红色框区域是一个自定义的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. 万亿级日志与行为数据存储查询技术剖析(续)——Tindex是改造的lucene和druid

    五.Tindex 数果智能根据开源的方案自研了一套数据存储的解决方案,该方案的索引层通过改造Lucene实现,数据查询和索引写入框架通过扩展Druid实现.既保证了数据的实时性和指标自由定义的问题,又 ...

  2. yii中渲染模板时render与renderPartial的区别

    render方法在渲染模板时会将渲染布局文件,而renderPartial则不会渲染布局

  3. Java中的final和static

    final final可以用在类.方法.变量上. 1.final用在类上,表明当前类它不能被继承,没有子类. 2.final用在方法上,表明当前方法不能被override,不能被重写. 3.final ...

  4. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...

  5. JavaWeb----文件的上传和下载

    一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件 ...

  6. Oauth2的遇坑一点提示(Spring Security Oauth2 / Cloud)

    1)使用@EnableOAuth2Sso的网页客户端,登录是成功的可是总是像没成功一样. 提示错误:没有 症结:context-path没设置,或者设置为/(ROOT) 参考资料:https://sp ...

  7. Eclipse中导入Hadoop源代码工程

    以hadoop 2.7.3为例, jdk1.7.0_80 , Eclipse Mars(4.5), Apache Maven 3.0.5   mvn时需要使用root权限,即县切换到root用户,用命 ...

  8. 1 python----pycharm本地部署spark

    下图相关工具连接 链接:https://pan.baidu.com/s/115XWf_Fc1yMiJytKJQXnFQ   密码:3jvr 好了,加油哟!

  9. 【Data Structure & Algorithm】二叉树中和为某值的所有路径

    二叉树中和为某值的所有路径 题目:输入一个整数和一个二叉树,从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二叉树: 10 ...

  10. java集合框架之比较器Comparator、Comparable

    参考http://how2j.cn/k/collection/collection-comparator-comparable/693.html Comparator 假设Hero有三个属性 name ...