WPF InkCanvas 继承类

Posted

技术标签:

【中文标题】WPF InkCanvas 继承类【英文标题】:WPF InkCanvas inherit class 【发布时间】:2016-05-16 19:11:33 【问题描述】:

我想创建一个自定义 InkCanvas Adorner,发现背后的逻辑:

您可以重复使用 InkCanvasEditingMode.Select 模式的现有套索功能。然后,在 SelectionChanged 事件中,您可以获得对选定笔划(和/或元素)的引用。现在清除选择(以摆脱标准装饰器),然后调出您的自定义装饰器。

如何在我自己的类中继承具有编辑模式的 InkCanvas 类并访问事件?

class myInkCanvasClass : InkCanvas ?

    base class constructor call ?
    ...


【问题讨论】:

【参考方案1】:
[DebuggerDisplay("[Scene]Strokes:Strokes.Count, Children:Children.Count")]
public class InkCanvas_Sandeep : InkCanvas

    public int PagId = -1;
    public InkCanvas_Sandeep()
    
        DefaultDrawingAttributes.Color = Colors.Red;
        DefaultDrawingAttributes.FitToCurve = true;
        DefaultDrawingAttributes.Height = 2;
        DefaultDrawingAttributes.Width = 2;
        DefaultDrawingAttributes.IgnorePressure = false;
        DefaultDrawingAttributes.IsHighlighter = false;
        DefaultDrawingAttributes.StylusTip = System.Windows.Ink.StylusTip.Ellipse;
        DefaultDrawingAttributes.StylusTipTransform = Matrix.Identity;
        HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
        VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
        SnapsToDevicePixels = true;
    

public void createMultipleInstances()

    InkCanvas_Sandeep canvas new InkCanvas_Sandeep();
    canvas.PagId = ++PageDetails.PageId;

【讨论】:

【参考方案2】:

您不必从InkCanvas 继承,SelectionChangedInkCanvas 上的公共事件,因此您只需向其添加处理程序即可。 EditingMode 也是一个公共属性,您也可以在 InkCanvas 的实例上设置它。因此,要将处理程序添加到SelectionChanged 并在InkSelect 之间切换EditingMode,您只需使用InkCanvas 实例的公共API。

基本示例:

inkCanvas.SelectionChanged += InkCanvas_SelectionChanged;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;

【讨论】:

我想在触发 SelectionChanged 事件时删除原始 InkCanvas - Select - Adorner 并将其替换为自定义 Adorner。所以我认为,我必须继承 InkCanvas 类并在 SelectionChanged 事件上调用自定义 Adorner。我将如何完成这个?【参考方案3】:

我设法将 InkCanvas 类继承到我的 CustomInkCanvas 类并获得了 SelectionChanged 的​​ EventListener:

public class CustomInkCanvas : InkCanvas

    //variables 

    //constructor
    public CustomInkCanvas()
    
       //...
    

    override protected void OnSelectionChanged(EventArgs e) 
    
        MessageBox.Show("Selection Changed");
    

所以,如果我更改了一个选择,我会被注意到。

【讨论】:

以上是关于WPF InkCanvas 继承类的主要内容,如果未能解决你的问题,请参考以下文章

WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 时加上背景色和按钮方法

WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 时加上背景色和按钮方法

WPFのInkCanvas作为蒙版透明笔迹不透明

WPF InkCanvas 毛笔效果

WPF InkCanvas EditingMode为Select时 在其选择时各种事件中撤销Select模式的方法

WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 做高性能笔迹应用