wp7, silverlight, почему событие запускается дважды? - PullRequest
0 голосов
/ 29 ноября 2010

В этом случае, когда пользователь нажимает некоторый элемент UIElement, я хочу, чтобы этот элемент был окружен пунктирной границей. Если есть какой-то другой объект, окруженный тогда, этот код сначала удаляет его.

Все хорошо, но "private void activElem" срабатывает дважды, и я понятия не имею, почему. Может быть, кто-то может помочь, у меня действительно нет больше идей.

Кто-нибудь знает некоторые идеи для устранения подобных проблем? Может быть, есть какой-то способ распечатать все очереди событий. Есть шпион Silverlight, но я думаю, что он не работает для Windows Phone 7.

Мой код:

 public class ManipulationEngine
{
    private Canvas sheet;
    private static FrameworkElement current_active_element;

    public ManipulationEngine(Canvas sheet)
    {
        this.sheet = sheet;

        foreach (FrameworkElement elem in sheet.Children)
        {
            elem.MouseLeftButtonUp += new MouseButtonEventHandler(activateElem);
        }

    }

    private void activateElem(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement elem = sender as FrameworkElement;

        if (current_active_element != null)
        {
            desactivateElem();
        }

        Grid grid = new Grid();
        Rectangle recentagle = new Rectangle();

        grid.SetValue(Canvas.TopProperty, (double)elem.GetValue(Canvas.TopProperty) - 10);
        grid.SetValue(Canvas.LeftProperty, (double)elem.GetValue(Canvas.LeftProperty) - 10);

        DoubleCollection stroke = new DoubleCollection();
        stroke.Add(4);
        stroke.Add(2);
        recentagle.StrokeDashArray = stroke;

        grid.Children.Add(recentagle);
        sheet.Children.Remove(elem);
        elem.Margin = new Thickness(10);
        grid.Children.Add(elem);
        sheet.Children.Add(grid);

        current_active_element = elem;
    }



    private void desactivateElem()
    {
        if (current_active_element != null)
        {
            Grid grid = VisualTreeHelper.GetParent(current_active_element) as Grid;

            grid.Children.Remove(current_active_element);
            sheet.Children.Remove(grid);

            current_active_element.SetValue(Canvas.TopProperty, (double)grid.GetValue(Canvas.TopProperty) + 10);
            current_active_element.SetValue(Canvas.LeftProperty, (double)grid.GetValue(Canvas.LeftProperty) + 10);
            current_active_element.Margin = new Thickness(0);

            sheet.Children.Add(current_active_element);

            current_active_element = null;
        }
    }

1 Ответ

0 голосов
/ 30 ноября 2010

Я бы действительно посоветовал изучить модель деталей и состояний. Вы можете сделать это с помощью кнопки или, возможно, переключателя.

Обычно, если вы кодируете изменения в визуальном дереве, вы делаете это неправильно.

Карен Корби очень ясно разобралась с этим на MIX08, взгляните!

http://archive.visitmix.com/blogs/2008Sessions/T20/

Люк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...