Итерационная проблема с Canvas.Children - PullRequest
1 голос
/ 10 сентября 2010

Я перебираю всех потомков данного объекта Canvas. Проблема в том, что это влияет только на одного из двух детей. Другая итерация в другом подобном событии работает просто отлично. У меня есть это, так что вы можете перетащить элементы:

    private Point lastmousepoint;   
    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
        {                
            Point mousepos = e.GetPosition(this);
            foreach (UIElement element in canvas1.Children)
            {
                Canvas.SetLeft(element, Canvas.GetLeft(element) + (mousepos.X - lastmousepoint.X));
                Canvas.SetTop(element, Canvas.GetTop(element) + (mousepos.Y - lastmousepoint.Y));
                lastmousepoint = mousepos;
            }
        }
        e.Handled = true;
    }
    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        lastmousepoint = e.GetPosition(this);
        e.Handled = true;
    }
    private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        e.Handled = true;
    } 

Но только один из двух текстов движется, тогда как они оба должны двигаться. Фактическое движение в порядке и работает как задумано.

Этот код

    private int CurrentScaleLevel = 0;
    private void Window_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        foreach (UIElement element in canvas1.Children)
        {
            Point p = e.MouseDevice.GetPosition(element);
            Matrix m = element.RenderTransform.Value;
            if (e.Delta > 0)
            {
                CurrentScaleLevel++;
                m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
            }
            else
            {
                CurrentScaleLevel--;
                m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);
            }
            Canvas.SetLeft(element, Canvas.GetLeft(element) + m.OffsetX);
            Canvas.SetTop(element, Canvas.GetTop(element) + m.OffsetY);
            m.Translate(-m.OffsetX, -m.OffsetY);
            element.RenderTransform = new MatrixTransform(m);
        }
        e.Handled = true;
    }

Влияет на оба объекта так же хорошо, как и должно.

1 Ответ

1 голос
/ 10 сентября 2010

Вы, вероятно, не хотите

lastmousepoint = mousepos;

внутри цикла foreach, потому что на последующих итерациях (mousepos.X - lastmousepoint.X) всегда будет нулевым, как и (mousepos.Y - lastmousepoint.Y). Добавление 0, конечно, означает отсутствие движения.

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