Перетаскивание через вкладку dragablz: TabablzControl для вывода на передний план - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы реализовать DragEnter-Event для каждого TabItem моего dragablz: TabablzControl.При перетаскивании файла поверх него должны автоматически выбираться вкладки.

Я обнаружил две темы о стекоперемещении, которые похожи на мой вопрос:

К сожалению, эти решения не работают для TabablzControl из Dragablz .

<dragablz:TabablzControl Name="TC_FooBar" FixedHeaderCount="3">
      <TabItem Header="FIRST">
            <!-- <ContentOfFirstTabItem/> -->
      </TabItem>
      <TabItem Header="SECOND">
            <!-- <ContentOfSecondTabItem/> -->
      </TabItem>
      <TabItem Header="THIRD">
            <!-- <ContentOfThirdTabItem/> -->
      </TabItem>
</dragablz:TabablzControl>

Что я пробовал до сих пор:

  • Реализация DragEnter и PreviewDragEnter событий для каждого TabItem и для самого TabablzControl.
  • Установка AllowDrop="True" для TabablzControl и каждого TabItem.

Каждый раз, когда e.Source соответствует содержимому выбранной в данный момент вкладки.Я не могу определить правильный TabItem.Есть идеи?

1 Ответ

0 голосов
/ 07 января 2019

Это довольно просто.

Вы уже подготовили правильную настройку:

<dragablz:TabablzControl DragEnter="TabControl_OnDragEnter" AllowDrop="True">
    <TabItem Header="FIRST"/>
    <TabItem Header="SECOND"/>
    <TabItem Header="THIRD"/>
</dragablz:TabablzControl>

AllowDrop равно true, и есть обработчик событий DragEnter с маршрутизацией.Обратите внимание, что это пузырьковое событие, но вы также можете использовать туннелирование PreviewDragEnter версии.

Волшебство произойдет в обработчике событий.Нам нужно свойство OriginalSource.Однако это будет какой-то Visual, представляющий TabItem, а не сам TabItem!Вы должны прочитать о стилях и шаблонах WPF, чтобы получить больше информации об этом.Все, что нам нужно, это перейти от того, что представляет Visual к фактическому TabItem.Мы можем сделать это, пройдясь по визуальному дереву, пока не найдем элемент:

private void TabControl_OnDragEnter(object sender, DragEventArgs e)
{
    // Just a sanity check - we need a Visual here
    if (!(e.OriginalSource is Visual v))
    {
        return;
    }

    // DragablzItems will represent our TabItems, so we search for those
    var item = GetParentOfType<DragablzItem>(v);

    // DragablzItem.Content should contain our original TabItem
    if (item != null && item.Content is TabItem ti)
    {
        ti.IsSelected = true;
    }
}

И вспомогательный метод GetParentOfType может выглядеть следующим образом:

static T GetParentOfType<T>(Visual visual) where T : Visual
{
    DependencyObject parent = visual;
    do
    {
        parent = VisualTreeHelper.GetParent(parent);
    } while (parent != null && !(parent is T));

    return parent as T;
}
...