如何在Canvas WPF中删除/删除ContentControl

时间:2015-10-15 04:40:36

标签: c# wpf canvas

我从WPF开始,我遇到了问题。请帮我。谢谢,抱歉我的英文不好!

我已将ContentControl添加到Canvas,我想删除/删除它。

绘制ContentControl代码:

ContentControl cc = new ContentControl();
cc.Content = shape;
cc.Height = h;
cc.Width = w;
Style s = myCanvas.FindResource("DesignerItemStyle") as Style;
cc.Style = s;
Canvas.SetLeft(cc, x);
Canvas.SetTop(cc, y);
myCanvas.Children.Add(cc); 

我使用HitTest删除它,但我只能删除形状

 private void myCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        Point pt = e.GetPosition((Canvas)sender);
        HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);            
        if (result != null)
        {
            myCanvas.Children.Remove(result.VisualHit as Shape); //it works with shape  
            // i have changed it into  myCanvas.Children.Remove(result.VisualHit as ContentControl); 
             //but it didn't work with ContentControl           
        }
    }  

3 个答案:

答案 0 :(得分:1)

之所以如此,是因为ContentControlShape的父级,而Canvas的子级包含托管该形状的ContentControl。 你可以这样做来解决你的问题:)

private void myCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    DependencyObject ob = FindAncestor<ContentControl>((DependencyObject)e.Source);
    if (ob.GetType() == typeof(ContentControl))
            myCanvas.Children.Remove(ob as ContentControl);           

}

public T FindAncestor<T>(DependencyObject dependencyObject)
        where T : DependencyObject
    {
        var parent = VisualTreeHelper.GetParent(dependencyObject);

        if (parent == null) return null;

        var parentT = parent as T;
        return parentT ?? FindAncestor<T>(parent);
    }

答案 1 :(得分:1)

我建议您使用下一个解决方案:

        private void myCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        var dObj = sender as DependencyObject;
        if(dObj == null) return;
        var ob = dObj.GetChildOfType<ContentControl>();
        if (ob != null)
        {
            myCanvas.Children.Remove(ob);
        }
    }

帮助程序代码:

 public static T GetChildOfType<T>(this DependencyObject depObj)
    where T : DependencyObject
    {
        if (depObj == null) return null;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            var child = VisualTreeHelper.GetChild(depObj, i);

            var result = (child as T) ?? GetChildOfType<T>(child);
            if (result != null) return result;
        }
        return null;
    }

将助手放在公共静态类中,因为它是一个扩展方法

问候

答案 2 :(得分:0)

您可以添加控件,例如:

Rectangle r = new Rectangle() { Name = "MyName" };

并从画布中删除:

UIElement element = StationLayout.FindName ("MyName") as UIElement;
StationLayout.Children.Remove(element);