Поиск дочерних объектов в ViewBox / Canvas Object - PullRequest
0 голосов
/ 21 октября 2010

Я реализовал перетаскивание, которое в основном работает в моем приложении Silverlight 4. После того, как пользователи поместили фигуры на холст, я захотел использовать Size & Child Decorators . Я пытался реализовать пример кода. Код ниже - это проблемный раздел гораздо большего приложения.

xmal -

<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>

c # код -

private void Camera1Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var sendingObj = sender as Canvas;
            if (sendingObj == null) return;
            foreach (UserControl l in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), sendingObj))
                {
                    if (l.Parent == Camera1Canvas )
                    {
                        adorn.AdornedElement = l as FrameworkElement;
                        adorn.adorned_MouseLeftButtonDown(l, e);
                        break;
                    }
                }
             base.OnMouseLeftButtonDown(e);
        }

Моя проблема в том, что когда VisualTreeHelper.FindElementsInHostCoordinates вызывается при событии щелчка левой кнопкой мыши, он не возвращает никаких элементов, когда я нажимаю на любой объект. Я уверен, что это проблема с отображением координат, но, поскольку для меня это новое основание, я не знаю, как ее исправить.

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Возможно, в вашем случае нет необходимости использовать метод 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);
    }
0 голосов
/ 21 октября 2010

Вам нужно изменить строку VisualTreeHelper на

GeneralTransform transform = sendingObj.TransformToVisual(Application.Current.RootVisual);
Point pnt = transform.Transform(e.GetPosition(sendingObj));
var elements = VisualTreeHelper.FindElementsInHostCoordinates(pnt,Application.Current.RootVisual);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...