Я помещаю строку (назовем ее строкой 1) на холст и прикрепляю к ней мыши, мышь, мышь и мыши. Затем создается другая строка (строка 2) с присоединенными к ней событиями. Все события отлично работают, когда выбрана любая из линий. По какой-то причине, когда первая строка, которая была создана, перетаскивается и освобождается по второй строке, созданной, линия не выделяется на холсте, однако она остается приклеенной к указателю мыши, пока другой клик не будет удален со второй строки. Эта проблема возникает, когда самые ранние созданные строки перетаскиваются по более новым строкам, а не наоборот (проблема возникает, когда линия 1 перетаскивается и освобождается в строке 2, но не наоборот, или строка 1 над 2 и 3, а строка 2 по строке 3 и т.д. я не знаю, что код может помочь в отношении решения этого вопроса, будет ли какие-либо предложения, или, возможно, сталкивались с подобной проблемойВыбор и снятие перекрытия графики в silverlight
ответ
причина наблюдаемого поведения довольно легко выводится:
Все элементы в 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
.
Большое спасибо за ответ :) В моем случае каждому элементу уже задан явный z-индекс, когда он создан, всегда одно значение больше предыдущего элемента, и все же эта проблема по-прежнему сохраняется. Я попытался изменить z-индекс холста на мышь и мышь, так как у меня есть свойство, чтобы показать, перетаскивается элемент или нет, однако это не решило проблему. Может быть, есть еще одна проблема? И спасибо за ваше терпение. – Maeglin77
Неважно, присваиваете ли вы явное и последовательно увеличиваемое свойство Z-Index или действует ли неявный z-порядок. Всякий раз, когда вы перемещаете ранее добавленный элемент вокруг него, он неизбежно будет лежать ниже тех, которые были добавлены позже. Поэтому вы должны убедиться, что выбранный и перемещенный элемент имеет самый высокий из всех z-индексов, существующих на данный момент.И я не понимаю, почему манипулирование z-индексом холста должно каким-либо образом решить проблему. – Martin
Спасибо большое за ваше предложение! :) – Maeglin77