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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Drag & Drop, нюансы 
V
    Опции темы
AleksPingvin
Дата 21.5.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый вечер уважаемые комрады!

Несмотря на то, что моя предыдущая тема так и осталась без ответа, рискну задать еще один вопрос.

Имеется ListBox (в нем лежат например кнопки), на него повешены обработчики событий PreviewMouseDown,  DragOver, Drop - перетаскивание реализованно стандартно.
Однако клик на кнопку не проходит.. как  я понял из-за того, что я подписан на PreviewMouseDown событие. Если  делать подписку на MouseDown,
то кнопки кликаются, но перестают таскаться итемы ListBox. Подскажите как быть? Надо что бы и таскалось и если надо то кликалось.

PM MAIL   Вверх
-Mikle-
Дата 21.5.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Мне неизвестно, каким образом вы все делаете. Проблема может быть где угодно.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
AleksPingvin
Дата 22.5.2011, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Согласен.. телепаты в отпуске... Извините, писал ночью - не сообразил по подробней расписать  smile 
Итак вот кусок XAML:
Код

<ListBox Name="List" VerticalContentAlignment="Center" AllowDrop="True" Background="Transparent" BorderBrush="Transparent" 
               PreviewMouseDown="List_PreviewMouseDown"
               DragOver="List_DragOver" Drop="List_Drop" Height="700" >
      <ListBox.ItemTemplate>
        <DataTemplate>
          <UniformGrid Name="grid" Style="{StaticResource ListUniGrid}"  VerticalAlignment="Center" Commands:PresentVisualStateManager.GoToState="{Binding State}" 
                       Core:ViewRegistry.Register="true" >
            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="ActionStates">
                <VisualState x:Name="Add"  Storyboard="{StaticResource AddAnimation}"/>
                <VisualState x:Name="Insert"  Storyboard="{StaticResource AddAnimation}"/>
                <VisualState x:Name="Delete"  Storyboard="{StaticResource DeleteAnimation}"/>
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
                             
            <Expander Header="{Binding Name}" ExpandDirection="Down" 
                      IsExpanded="True" HorizontalAlignment="Left" Height="Auto" Margin="4" Width="400">
                     
                <StackPanel>
                    <TextBlock TextWrapping="Wrap" Text="{Binding Descr}"/>
                    <Button Content="+++++" Width="100" Height="19"/>
                 </StackPanel>
             </Expander>
          </UniformGrid>

Вот код обработчика нажатия:
Код

private void List_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                ListBox parent = sender as ListBox;
                dragStartPoint = e.GetPosition(this.parent.WinContainer);
                this.parent.SourceDrag = parent;

                UIElement dataContainer;
                object data = Utils.GetObjectDataFromPoint(parent, e.GetPosition(parent), out dataContainer);

                if (data != null)
                {
                    ...тут код отрисовки Adorner-а...
                    DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
                }
            }
        }


При таком раскладе когда я кликаю на свертывание-развертывание экспандера или тестовую кнопку внутри него - то они не нажимаются.




PM MAIL   Вверх
-Mikle-
Дата 22.5.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата

как  я понял из-за того, что я подписан на PreviewMouseDown событие

Нет, это из-за того, что при клике ты сразу начинаешь операцию Drag&Drop.

В твоем случае могу предложить не начинать операцию Drag пока юзер не начнет движение мышкой. Чтобы дать пользователю некую лояльность при кликах (как правило случайную), можно задать некую область в которой ему разрешено двигаться при нажатой левой кнопке до того, как начнется перетаскивание. В примере ниже задается такая область ±5 пикселей.

Код

Rect? beforeDragArea = null;
private void listBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ListBox listBox = (ListBox)sender;
    var mpos = e.GetPosition(this);
    beforeDragArea = new Rect(mpos.X - 5, mpos.Y - 5, 10, 10);
    listBox.PreviewMouseMove += listBox_PreviewMouseMove;
    listBox.PreviewMouseUp += listBox_PreviewMouseUp;
}

private void listBox_PreviewMouseMove(object sender, MouseEventArgs e)
{
    ListBox listBox = (ListBox)sender;
    if (beforeDragArea.HasValue && !beforeDragArea.Value.Contains(e.GetPosition(this)))
    {
        listBox.PreviewMouseMove -= listBox_PreviewMouseMove;
        listBox.PreviewMouseUp -= listBox_PreviewMouseUp;
        beforeDragArea = null;
        DragDrop.DoDragDrop(listBox, "some data object", DragDropEffects.Move);
    }
}

private void listBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    ListBox listBox = (ListBox)sender;
    listBox.PreviewMouseMove -= listBox_PreviewMouseMove;
    listBox.PreviewMouseUp -= listBox_PreviewMouseUp;
    beforeDragArea = null;
}


Весь этот код можно оформить в виде AttachedProperty чтобы в дальнейшем его можно было использовать с любым контролом.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
AleksPingvin
Дата 22.5.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Самое смешное, что я вчера об этом думал... но не придал значение. Действительно все дело было именно в этом) Спасибо!
PM MAIL   Вверх
-Mikle-
Дата 22.5.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Рад помочь. Приходи еще.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Rohoss
Дата 23.5.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(-Mikle- @  22.5.2011,  11:56 Найти цитируемый пост)
В твоем случае могу предложить не начинать операцию Drag пока юзер не начнет движение мышкой. Чтобы дать пользователю некую лояльность при кликах (как правило случайную), можно задать некую область в которой ему разрешено двигаться при нажатой левой кнопке до того, как начнется перетаскивание. В примере ниже задается такая область ±5 пикселей.

Ещё, как мне кажется, лучше использовать системные параметры дистанции для начала драга
Код

         private void lvFileList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            startPoint = e.GetPosition(null);
        }

        private void lvFileList_PreviewMouseMove(object sender, MouseEventArgs e)
        {

            Point mousePos = e.GetPosition(null);
            Vector diff = startPoint - mousePos;

            if (e.LeftButton == MouseButtonState.Pressed &&
                Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance && 
                Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
................................



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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