2016-05-26 5 views
0

Я помещаю строку (назовем ее строкой 1) на холст и прикрепляю к ней мыши, мышь, мышь и мыши. Затем создается другая строка (строка 2) с присоединенными к ней событиями. Все события отлично работают, когда выбрана любая из линий. По какой-то причине, когда первая строка, которая была создана, перетаскивается и освобождается по второй строке, созданной, линия не выделяется на холсте, однако она остается приклеенной к указателю мыши, пока другой клик не будет удален со второй строки. Эта проблема возникает, когда самые ранние созданные строки перетаскиваются по более новым строкам, а не наоборот (проблема возникает, когда линия 1 перетаскивается и освобождается в строке 2, но не наоборот, или строка 1 над 2 и 3, а строка 2 по строке 3 и т.д. я не знаю, что код может помочь в отношении решения этого вопроса, будет ли какие-либо предложения, или, возможно, сталкивались с подобной проблемойВыбор и снятие перекрытия графики в silverlight

ответ

0

причина наблюдаемого поведения довольно легко выводится:

Все элементы в Panel имеют неявный z-порядок, который вступает в силу, если для элемента en не задано свойство ZIndex. Ранее добавленные элементы имеют более низкий z-порядок, чем более поздние добавленные элементы (разметка xaml - это синтаксический анализ от вершины до бо ttom и элементы, которые встречаются ранее, добавляются ранее).

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

Я могу придумать несколько способов решить эту проблему:

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

private void OnElementSelected() 
{ 
    // todo: maybe we need to store the previous zindex value and re-assign it later 
    // to prevent it from getting lost 
    Canvas.SetZIndex(this, Int32.MaxValue); 
} 

private void OnElementReleased() 
{ 
    this.ClearValue(Canvas.ZIndexProperty); 
    // todo: maybe re-assign stored z-index value 
} 

Альтернативное решение будет иметь прозрачный MouseEventObserver помещается на весь ваш Canvas который активизируется, как только вы выбираете элемент, то порядок ваших элементов Безразлично» .

Редактировать

Хорошего факт (многие разработчики, вероятно, не знает) о вложенном свойстве Canvas.ZIndex: он работает для каждого типа панели, а не только для Canvas. Таким образом, вы можете даже указать z-порядок элементов внутри Grid с Canvas.ZIndex.

+0

Большое спасибо за ответ :) В моем случае каждому элементу уже задан явный z-индекс, когда он создан, всегда одно значение больше предыдущего элемента, и все же эта проблема по-прежнему сохраняется. Я попытался изменить z-индекс холста на мышь и мышь, так как у меня есть свойство, чтобы показать, перетаскивается элемент или нет, однако это не решило проблему. Может быть, есть еще одна проблема? И спасибо за ваше терпение. – Maeglin77

+0

Неважно, присваиваете ли вы явное и последовательно увеличиваемое свойство Z-Index или действует ли неявный z-порядок. Всякий раз, когда вы перемещаете ранее добавленный элемент вокруг него, он неизбежно будет лежать ниже тех, которые были добавлены позже. Поэтому вы должны убедиться, что выбранный и перемещенный элемент имеет самый высокий из всех z-индексов, существующих на данный момент.И я не понимаю, почему манипулирование z-индексом холста должно каким-либо образом решить проблему. – Martin

+0

Спасибо большое за ваше предложение! :) – Maeglin77

Смежные вопросы