UWP 父级InkToolbar如何绑定动态生成子控件内的InkCanvas
问题根因与修复方案
1. 绑定语法错误
你在Main.xaml中给TestControl的InkToolbarControl属性绑定时写法有误:
<!-- 错误写法:指定ElementName后又加Path=InkToolbar,相当于查找InkToolbar控件的InkToolbar属性,取不到有效值 --> <local:TestControl ... InkToolbarControl="{Binding Path=InkToolbar, ElementName=InkToolbar}" />
正确写法是直接绑定到指定名称的控件本身:
<local:TestControl ... InkToolbarControl="{Binding ElementName=InkToolbar}" />
2. 时序与逻辑错误
(1)依赖属性赋值时序问题
TestControl构造函数执行时,InkToolbarControl依赖属性还未完成绑定赋值,此时访问必然为null。需要给该依赖属性添加属性变更回调,等赋值完成后再执行关联逻辑:
// 修改InkToolbarControl依赖属性定义,添加属性变更回调 public static readonly DependencyProperty InkToolbarControlProperty = DependencyProperty.Register(nameof(InkToolbarControl), typeof(InkToolbar), typeof(TestControl), new PropertyMetadata(null, OnInkToolbarChanged)); private static void OnInkToolbarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // 这里可以做InkToolbar赋值后的初始化操作 }
(2)输入处理与绑定逻辑写反
你注释的代码中逻辑完全颠倒:指针进入InkCanvas时应该关联TargetInkCanvas,而不是设为null。同时你之前把InkPresenter.InputProcessingConfiguration.Mode设为None,会导致InkToolbar的默认笔迹处理逻辑失效。修正后的Pointer事件逻辑如下:
private void ConfigureInkCanvas() { InkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Touch; // 删掉原来的Mode=None设置,或者直接设为Inking让InkToolbar接管 InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Inking; // 其余原有配置保持不变 ... } private void InkCanvasUnprocessedInputPointerEntered(InkUnprocessedInput sender, PointerEventArgs args) { if (InkToolbarControl != null) { InkToolbarControl.TargetInkCanvas = InkCanvas; } }
更优实现思路
你可以完全去掉TestControl里的InkToolbarControl依赖属性,降低控件耦合:
- 给
TestControl添加一个公开只读属性,直接返回内部的InkCanvas实例 - 在父控件
MainViewer中统一监听所有TestControl的PointerEntered事件,触发时直接将当前控件的InkCanvas赋值给全局InkToolbar的TargetInkCanvas即可,不需要每个子控件都传递InkToolbar实例。
内容的提问来源于stack exchange,提问作者Madushan Amarasinghe
相关产品推荐
相关产品推荐

