UWP如何访问已应用ControlTemplate的控件实例中的命名模板元素
UWP 获取CalendarViewDayItem模板内部元素的实现方法
你可以通过ControlTemplate.FindName()方法直接获取对应实例模板内的元素,这是UWP模板内元素访问的标准实现,完整代码如下:
private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args) { CalendarViewDayItem dayItem = args.Item; // 强制应用模板,确保模板已经渲染到当前控件实例 dayItem.ApplyTemplate(); // 第二个参数必须传入当前的CalendarViewDayItem实例,匹配对应实例的可视化树 Grid itemGrid = dayItem.Template.FindName("itemgrid", dayItem) as Grid; if (itemGrid != null) { // 此处执行你对itemgrid的业务逻辑 } else { // 极端场景下模板未加载完成时,通过Loaded事件延迟获取 RoutedEventHandler loadedHandler = null; loadedHandler = (s, e) => { dayItem.Loaded -= loadedHandler; Grid targetGrid = dayItem.Template.FindName("itemgrid", dayItem) as Grid; if (targetGrid != null) { // 执行业务逻辑 } }; dayItem.Loaded += loadedHandler; } }
注意事项
- 不要直接修改
CalendarViewDayItem.Template的静态内容,所有同类型控件共享同一个模板实例,直接修改会全局生效 - 如果你的CalendarView开启了虚拟化,不要在该事件中做过重的计算操作,避免滑动卡顿
- 如果你需要频繁访问该元素,也可以自定义附加属性,在
CalendarViewDayItem的样式模板中直接把itemgrid绑定到附加属性上,后续直接读附加属性即可,不需要每次查找
内容的提问来源于stack exchange,提问作者Patrik Staron
相关产品推荐
相关产品推荐

