UIElement в многослойной моде - PullRequest
       30

UIElement в многослойной моде

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

Технология: Silverlight Платформа: Windows Phone 7

foreach(Rectangle rec in listrect)
{
    Layoutroot.Children.Add(rec);
}

Сделано несколько событий захвата движения мышью и перетаскивание этих прямоугольников.

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

Как я могу избежать этого и сделать все UIElement в одной плоскости, независимо от того, в каком порядке они добавляются к потомку холста?

1 Ответ

0 голосов
/ 13 сентября 2010

Каждый элемент нарисован с различным индексом ZIndex от Silverlight.Если вы не укажете ZIndex, Silverlight предполагает, что у самых последних добавленных элементов подразумевается более высокий ZIndex.То же самое относится и к XAML - элементы ниже других элементов подразумевают более высокое значение ZIndex.

Если вы хотите контролировать рисование ваших элементов Rect в вашем примере, вам нужно изменить ZIndex вручную,Во-первых, убедитесь, что ваш элемент Layoutroot имеет значение Canvas.Затем в обработчиках событий перемещения мыши измените свойство зависимости ZIndex на большее.

Например, в этом примере выделенный прямоугольник будет перемещен на передний план во время его перемещения.

<phone:PhoneApplicationPage x:Class="WindowsPhoneApplication1.MainPage"
                            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                            xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone">
    <Canvas x:Name="LayoutRoot" Background="Transparent" />
</phone:PhoneApplicationPage>

И код позади:

using System;
using System.Collections.Generic;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace WindowsPhoneApplication1
{
    public partial class MainPage : PhoneApplicationPage
    {
        private readonly Random _rnd = new Random();
        private List<Rectangle> _listRect;
        private Rectangle _selectedRect;
        private int _selectedRectPrevZIndex;
        public MainPage()
        {
            InitializeComponent();
            LayoutRoot.MouseMove += Rectangle_MouseMove;
            CreateAndAddRectangles();
            AddRectangles();
        }
        private void CreateAndAddRectangles()
        {
            _listRect = new List<Rectangle>(10);
            for (var i = 0; i < 10; i++)
            {
                var rec = new Rectangle {Height = 50, Width = 50};
                rec.SetValue(Canvas.LeftProperty, i * 30d);
                rec.SetValue(Canvas.TopProperty, i * 30d);
                rec.Fill = new SolidColorBrush(
                    Color.FromArgb(255,
                                   Convert.ToByte(_rnd.NextDouble() * 255),
                                   Convert.ToByte(_rnd.NextDouble() * 255),
                                   Convert.ToByte(_rnd.NextDouble() * 255)));
                rec.MouseLeftButtonDown += Rectangle_MouseLeftButtonDown;
                rec.MouseLeftButtonUp += Rectangle_MouseLeftButtonUp;
                rec.MouseMove += Rectangle_MouseMove;
                _listRect.Add(rec);
            }
        }
        private void AddRectangles()
        {
            foreach (var rec in _listRect)
                LayoutRoot.Children.Add(rec);
        }
        private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var rec = sender as Rectangle;
            if (rec == null)
                return;

            _selectedRectPrevZIndex = (int)rec.GetValue(Canvas.ZIndexProperty);
            System.Diagnostics.Debug.WriteLine(_selectedRectPrevZIndex);
            rec.SetValue(Canvas.ZIndexProperty, 100);
            _selectedRect = rec;
        }
        private void Rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            var rec = sender as Rectangle;
            if (rec == null || _selectedRect == null)
                return;

            rec.SetValue(Canvas.ZIndexProperty, _selectedRectPrevZIndex);
            _selectedRect = null;
        }
        void Rectangle_MouseMove(object sender, MouseEventArgs e)
        {
            if (_selectedRect == null)
                return;

            var pos = e.GetPosition(LayoutRoot);
            _selectedRect.SetValue(Canvas.LeftProperty, pos.X);
            _selectedRect.SetValue(Canvas.TopProperty, pos.Y);
        }
    }
}
...