【问题标题】:Dragging over a dragablz:TabablzControl tab to bring it to front拖动一个 dragablz:TabablzControl 选项卡将其置于前面
【发布时间】:2019-01-08 01:12:29
【问题描述】:

我想为我的 dragablz:TabablzControl 的每个 TabItem 实现一个 DragEnter-Event。将文件拖到其上时应自动选择选项卡。

我在 stackoverflow 上发现了两个似乎与我的问题相似的主题:

很遗憾,这些解决方案不适用于来自Dragablz 的 TabablzControl。

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

到目前为止我所尝试的:

  • 为每个 TabItem 和 TabablzControl 本身实现 DragEnterPreviewDragEnter 事件。
  • 为 TabablzControl 和每个 TabItem 设置 AllowDrop="True"

每次e.Source 等于当前选定选项卡的内容。我无法识别正确的 TabItem。有什么想法吗?

【问题讨论】:

    标签: c# wpf drag-and-drop tabitem


    【解决方案1】:

    这很容易。

    您已经准备好正确的设置:

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

    AllowDroptrue 并且有一个 DragEnter 路由事件处理程序。请注意,这是一个冒泡事件,但您也可以使用隧道 PreviewDragEnter 版本。

    魔术将在事件处理程序中发生。我们需要OriginalSource 属性。但是,这将是一些代表TabItemVisual,而不是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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 2011-05-26
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多