Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ViewBox/Canvas对象中查找子对象_C#_Silverlight_Silverlight 4.0 - Fatal编程技术网

C# 在ViewBox/Canvas对象中查找子对象

C# 在ViewBox/Canvas对象中查找子对象,c#,silverlight,silverlight-4.0,C#,Silverlight,Silverlight 4.0,我已经实现了一个拖放,它主要在我的Silverlight 4应用程序中工作。一旦用户将形状放到画布上,我就想使用。我已尝试实现示例代码。下面的代码是更大的应用程序的问题部分 克马尔- <ScrollViewer Grid.RowSpan="1" Grid.Row="2" Grid.ColumnSpan="2" Grid.Column="2" Name="scrollViewer"> <Viewbox Margin="0" MinWidth="400" MinHeigh

我已经实现了一个拖放,它主要在我的Silverlight 4应用程序中工作。一旦用户将形状放到画布上,我就想使用。我已尝试实现示例代码。下面的代码是更大的应用程序的问题部分

克马尔-

<ScrollViewer Grid.RowSpan="1" Grid.Row="2" Grid.ColumnSpan="2" Grid.Column="2" Name="scrollViewer">
    <Viewbox Margin="0"  MinWidth="400" MinHeight="500" 
        HorizontalAlignment="Left" VerticalAlignment="Top" Name="ViewBoxTestBuild">
        <Canvas x:Name="Camera1Canvas" telerikDragDrop:RadDragAndDropManager.AllowDrop="True" 
            Width="1200" Height="768" MouseLeftButtonDown="Camera1Canvas_MouseLeftButtonDown">
            <Image x:Name="Camera1Image" Source="timemagadj.jpg" Canvas.ZIndex="-1"  
                  HorizontalAlignment="Left" VerticalAlignment="Top" />
            <local:Three_Line_Graphic x:Name="threeLineEditTool" 
                  HorizontalAlignment="Left" Canvas.Left="594" Canvas.Top="621" />
            <l:Adorner x:Name="adorn" Canvas.ZIndex="100" />
        </Canvas>
    </Viewbox>
</ScrollViewer>

我的问题是,当在鼠标左键单击事件中调用VisualTreeHelper.FindElementsInHostCoordinates时,当我单击任何对象时,它不会返回任何元素。我确信这是一个坐标映射问题,但由于这是我的新领域,我不确定如何解决它。

您需要将VisualTreeHelper行更改为

GeneralTransform transform = sendingObj.TransformToVisual(Application.Current.RootVisual);
Point pnt = transform.Transform(e.GetPosition(sendingObj));
var elements = VisualTreeHelper.FindElementsInHostCoordinates(pnt,Application.Current.RootVisual);

在您的情况下,可能不需要使用VisualTreeHelper方法

由于您控制画布中的元素,并且知道它们的类型,因此可以尝试以下操作:

private void Camera1Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var sendingObj = sender as Canvas;
        if (sendingObj == null) return;
        foreach (UserControl l in sendingObj.Children)
            {
                var position = e.GetPosition(l);
                var lArea = new Rect(0,0,l.ActualWidth,l.ActualHeight);
                if (lArea.Contains(position))
                {
                    adorn.AdornedElement = l as FrameworkElement;
                    adorn.adorned_MouseLeftButtonDown(l, e);
                    break;
                }
            }
         base.OnMouseLeftButtonDown(e);
    }
这比命中测试更有效。但是,这仅在矩形区域可接受时有效

如果需要检测矩形以外的形状,则可以使用以下方法,只要将UserControl实例填充到画布中:

private void Camera1Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var sendingObj = sender as Canvas;
        if (sendingObj == null) return;

        var elements = VisualTreeHelper
             .FindElementsInHostCoordinates(
                 e.GetPosition(sendingObj), sendingObj);

        foreach (var l in elements)
        {
            if (l is UserControl)
            {
                adorn.AdornedElement = l as FrameworkElement;
                adorn.adorned_MouseLeftButtonDown(l, e);
                break;
            }
        }
        base.OnMouseLeftButtonDown(e);
    }

您的建议仍然没有返回任何元素。请编辑以显示其他方式。SL坐标系有点古怪,有几个怪癖。只需修改一下就可以了:“VisualTreeHelper.FindElementsInHostCoordinates(pnt,sendingObj);”我喜欢这个答案,我以后会使用它。谢谢
private void Camera1Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var sendingObj = sender as Canvas;
        if (sendingObj == null) return;

        var elements = VisualTreeHelper
             .FindElementsInHostCoordinates(
                 e.GetPosition(sendingObj), sendingObj);

        foreach (var l in elements)
        {
            if (l is UserControl)
            {
                adorn.AdornedElement = l as FrameworkElement;
                adorn.adorned_MouseLeftButtonDown(l, e);
                break;
            }
        }
        base.OnMouseLeftButtonDown(e);
    }