我正在尝试了解 WPF 的细节,但遇到了障碍。我知道 Selector 是一个从 ItemsControl 继承的抽象类,并添加了从其子项中选择的能力。我知道 ItemsControls 具有可以设置子项外观的 ItemTemplates 和排列这些项的面板。我知道通常有一个 ItemContainer(至少在 ListBoxItem 的情况下)具有 IsSelected 属性,我相信它可以触发 ListBox 选择更改事件(这可能不是正确的名称)。
我完全搞不懂的是,是什么在内部改变了 IsSelected 的状态?您单击了某个项目,因此可能是鼠标按下或预览鼠标按下之类的操作...然后是命中测试?
我一直在https://referencesource.microsoft.com/上仔细检查 ListBox、TabControl 和 Selector 源代码,试图找到点击的来源...是在面板上吗?有外部来源吗?我是否对这里发生的事情存在根本性的误解?
ListBoxItem 已重写
OnMouseLeftButtonDown
并OnMouseRightButtonDown
调用私有HandleMouseButtonDown
方法的方法,该方法又调用NotifyListItemClicked
ListBox 类的内部方法,最终设置项目的IsSelected
属性。从参考资料来源复制: