2011-06-16 28 views
4

我在允許用戶使用觸筆,觸摸或鼠標繪製的窗口上有一個InkCanvas。我也允許用戶添加文本。用戶點擊「添加文本」按鈕,然後點擊畫布上他們想要文本的位置。一個文本框出現在那裏,允許他們輸入。在輸入或失去焦點時,我創建一個ContentControl並將其添加到myInkCanvas.Children清除InkCanvas的子項

我希望用戶能夠在InkCanvas處於擦除模式時(我正在使用EraseByPoint)擦除它們創建的文本。我試圖捕獲內容控件的MouseEnterPreviewMouseMove事件,但似乎都沒有觸發。

是否有我能捕獲的事件?有沒有更好的方法來處理這種情況?它甚至有可能嗎?

回答

4

可以使用命中測試用於此目的
看看here

得到InkPresenter第一

public T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
      break; 
    } 
    return child; 
} 

InkPresenter inkPresenter = GetVisualChild<InkPresenter>(myInkCanvas); 

然後讓你點HitTestResult

HitTestResult hitTestResult = VisualTreeHelper.HitTest(inkPresenter, new Point(x, y)); 

那麼你可以使用hitTestResult.VisualHit刪除此物件

+0

因此,我需要在inkcanvas上捕獲鼠標事件,並在每個事件上對inkcanvas的每個子項執行命中測試? – 2011-06-17 13:58:50

+0

是的,像MouseDown這樣的事件 – 2011-06-17 14:00:54

+0

看起來很酷。我似乎無法找到GetVisualChild的通用版本。那是什麼名字空間? – 2011-06-17 14:04:00