Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ZIndex элемента канваса, Сделать верхним при наведении мышкой 
:(
    Опции темы
Anyone
Дата 14.10.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

        void Connection_MouseEnter(object sender, MouseEventArgs e)
        {
            _canvas = VisualTreeHelper.GetParent(this) as Canvas;
            if (_canvas != null)
            {
                var lines = from item in _canvas.Children.OfType<Connection>()
                           orderby Canvas.GetZIndex(item as UIElement) descending
                            select item as UIElement;

                foreach (UIElement line in lines)
                {
                    int ZIndex = Canvas.GetZIndex(line);
                    Canvas.SetZIndex(line, Canvas.GetZIndex(this));
                    Canvas.SetZIndex(this, ZIndex);
                    break;
                }
            }
        }

Но проблема в том, что все элементы имеют ZIndex = 0.
При добавлении элемента на канву, необходимо вручную задавать ZIndex, или есть другой способ решегия задачи?

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

Это сообщение отредактировал(а) Anyone - 14.10.2009, 10:53
PM MAIL   Вверх
math64
Дата 14.10.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Насколько я понял, нужно либо задавать ZIndex для всех элементов канвы (для нового элемента ZIndex=canvas.Children.Count), либо поместить нужный элемент в конец Children (при этом ни у каких элементов не должно быть ZIndex).

Добавлено через 4 минуты и 42 секунды
Если нужно поднимать элемент только для элементов своего типа, раздели канву на слои, для каждого типа свой. Тогда чтобы понять все элементы одного типа, нужно поднять соответсвующий слой.
PM   Вверх
Anyone
Дата 14.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я сделал так.
Одним элементам задаю Z-индекс так:
Canvas.SetZIndex(item, canvas.Children.OfType<CanvasItem>().Count()+1);
Тем, которые должны быть выше (тупо, но работает):
Canvas.SetZIndex(con1, 1000000 * (canvas.Children.OfType<Connection>().Count()+1));
А те, которые в самом верху - со значением Int32.MaxValue.
При этом мой код, который я привел выше, работает хорошо.

Цитата(math64 @  14.10.2009,  12:15 Найти цитируемый пост)
Если нужно поднимать элемент только для элементов своего типа, раздели канву на слои, для каждого типа свой. Тогда чтобы понять все элементы одного типа, нужно поднять соответсвующий слой.

А как канву разделить на слои?
PM MAIL   Вверх
math64
Дата 15.10.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Что то вроде этого:
Код

<Canvas>
   <Canvas Name="Elements" Canvas.ZIndex="2">
     <my:Element Name="Element1" Canvas.Left="100" Canvas.Top="100" Canvas.ZIndex="1"/>
     <my:Element Name="Element2" Canvas.Left="100" Canvas.Top="200" Canvas.ZIndex="2"/>
   </Canvas>
   <Canvas Name="Connections" Canvas.ZIndex="1">
     <my:Connection From="Element1.Bottom" To="Element2.Top"/>
   </Canvas>
   <Canvas Name="Labels" Canvas.ZIndex="3">
      <Label my:Connection.Align="Element1.Right">Элемент 1</Label>
   </Canvas>
</Canvas>

PM   Вверх
Anyone
Дата 15.10.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я подумал что сама канва это позволяет сделать.
К сожалению, при написании собственной канвы я не учитывал возможность разбиения на слои, потому написать так я сейчас не могу без переписования кода... 
Есть идея на мой канвас кидать канвасы-слои, а элементы уже на эти слои. Должно получиться, спасибо за подсказку!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.