2010-09-09 4 views
1

технологии: Silverlight Платформы: Windows Phone 7UIElement в слоистых модах

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

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

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

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

+0

Что ваш вопрос? –

+0

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

+0

Tintu, так работает система ... элементы, добавленные в панель позже, будут сверху. –

ответ

0

Каждый элемент рисуется с помощью другого 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); 
     } 
    } 
}