zoukankan      html  css  js  c++  java
  • 拖放功能

    关于拖放,可以通过以下博客对拖放之间的事件关系进行了解
    http://www.cnblogs.com/loveis715/archive/2011/12/05/2277384.html


    拖放的公用类库 Platform.Common中的DragAndDrop,其中
    DragDropAdorner用来显示被拖拽的界面元素的预览
    Win32:用于返回鼠标位置
    Utils:获取拖放的项

    以上直接引用即可,具体拖放的实现要根据【拖拽源】和【拖拽目标】的不同以及值的不同处理而自行编写

    以下为将TreeView子项拖放到ListBox中的示例

    XML中

    【拖放源】
    1.设置属性AllowDrop="True"
    <TreeView x:Name="DragTreeSource" ItemsSource="{Binding OcComDepRoleTree}"
    BorderThickness="0" Background="#D3E2C5" Margin="10,5,0,5"
    ItemTemplate="{StaticResource ItemNode}"
    HorizontalAlignment="Left" Width="200"
    AllowDrop="True">
    </TreeView>
    2.添加事件TreeViewItem事件
    <Style TargetType="TreeViewItem">
    <EventSetter Event="TreeViewItem.PreviewMouseMove" Handler="OnPreviewListBoxMouseMove"/>
    <EventSetter Event="TreeViewItem.QueryContinueDrag" Handler="OnQueryContinueDrag"/>
    </Style>
    note:此时的TreeView的Style不能设置为静态的资源了,样式什么的都要自己写进来,以上省去为了突出事件

    【拖放目标】
    1.设置属性AllowDrop="True";
    2.绑定事件命令 DragDrop.DragOver="OnSignDragOver" DragDrop.Drop="OnSignDrop"
    <ListBox x:Name="lstSign" Background="#D3E2C5"
    AllowDrop="True"
    DragDrop.DragOver="OnSignDragOver" DragDrop.Drop="OnSignDrop"
    ItemsSource="{Binding OcDepForSign, Mode=TwoWay}" />


    CS 中
    AdornerLayer mAdornerLayer = null; //装饰器
    【拖放源】
    private void OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
    mAdornerLayer.Update();
    }
    private void OnPreviewListBoxMouseMove(object sender, MouseEventArgs e)
    {
    if (Mouse.LeftButton != MouseButtonState.Pressed)
    return;

    Point pos = e.GetPosition(DragTreeSource);
    HitTestResult result = VisualTreeHelper.HitTest(DragTreeSource, pos);
    if (result == null)
    return;

    TreeViewItem treeItem = Utils.FindVisualParent<TreeViewItem>(result.VisualHit); // Find your actual visual you want to drag
    if (treeItem == null || treeItem.DataContext != DragTreeSource.SelectedItem || !(DragTreeSource.SelectedItem is BaseTreeModel))
    return;


    DragDropAdorner adorner = new DragDropAdorner(treeItem); //(DragDropAdorner实现Adorner抽象类)

    mAdornerLayer = AdornerLayer.GetAdornerLayer(DragTreeSource);

    mAdornerLayer.Add(adorner);

    BaseTreeModel dataItem = treeItem.DataContext as BaseTreeModel;

    DataObject dob = new DataObject(dataItem);

    DragDrop.DoDragDrop(DragTreeSource, dob, DragDropEffects.Copy);//启动拖拽

    mAdornerLayer.Remove(adorner);
    }

    【拖放目标】

    private void OnSignDragOver(object sender, DragEventArgs e)
    {
    OnDragOver(e,lstSign);
    }
    private void OnSignDrop(object sender, DragEventArgs e)
    {
    OnDrag(e, lstSign);
    }

    private void OnDrag(DragEventArgs e ,ListBox lst)
    {
    try
    {
    Point pos = e.GetPosition(lst);
    HitTestResult result = VisualTreeHelper.HitTest(lst, pos);
    if (result == null)
    return;
    //获取拖放数据
    BaseTreeModel dataItdem = e.Data.GetData(typeof(BaseTreeModel)) as BaseTreeModel;
    //数据处理

    }
    catch (Exception ex)
    {
    throw ex;
    }
    }
    private void OnDragOver(DragEventArgs e,ListBox lst)
    {
    e.Effects = DragDropEffects.None;

    Point pos = e.GetPosition(lst);
    HitTestResult result = VisualTreeHelper.HitTest(lst, pos);
    if (result == null)
    return;

    ListBoxItem selectedItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);
    if (selectedItem != null)
    selectedItem.IsSelected = true;
    e.Effects = DragDropEffects.Copy;
    }

  • 相关阅读:
    [持续交付实践] Jenkins 中国用户大会参会见闻
    [持续交付实践] 研发协作平台:从交付流水线到研发协作平台
    [持续交付实践] pipeline使用:Shared Libraries
    [持续交付实践] 交付流水线设计:分层自动化测试
    [持续交付实践] 交付流水线设计:安全专项测试
    openstack手动安装
    python threading模块2
    socket粗解
    python实现Telnet远程登陆到设备并执行命令
    Shell脚本学习
  • 原文地址:https://www.cnblogs.com/mamaxiaoling/p/9879416.html
Copyright © 2011-2022 走看看