zoukankan      html  css  js  c++  java
  • WPF 实现拖放的简单实例(Drag & Drop)

    概述:拖放的原理不再说明,wpf实现的简单实例

    一、XAML部分

    XAML
     1 <Window x:Class="WpfDragDropGrid.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         Loaded="Window_Loaded"
     5         Title="MainWindow" Height="450" Width="600">
     6     <Grid>
     7         <Grid.ColumnDefinitions>
     8             <ColumnDefinition Width="269*"/>
     9             <ColumnDefinition Width="11*"/>
    10             <ColumnDefinition Width="312*"/>
    11         </Grid.ColumnDefinitions>
    12         <DataGrid x:Name="dgRight" Margin="0" Grid.Column="2" AutoGenerateColumns="False" Drop="dgRight_Drop"
    13                   IsReadOnly="True" SelectionMode="Single" AllowDrop="True">
    14             <DataGrid.Columns>
    15                 <DataGridTextColumn Binding="{Binding devname}" ClipboardContentBinding="{x:Null}" Header="设备" Width="*"/>
    16                 <DataGridTextColumn Binding="{Binding spot1}" ClipboardContentBinding="{x:Null}" Header="测点1" Width="*"/>
    17                 <DataGridTextColumn Binding="{Binding spot2}" ClipboardContentBinding="{x:Null}" Header="测点2" Width="*"/>
    18                 <DataGridTextColumn Binding="{Binding spot3}" ClipboardContentBinding="{x:Null}" Header="测点3" Width="*"/>
    19             </DataGrid.Columns>
    20         </DataGrid>
    21         <ListBox x:Name="listBox" Margin="0" Background="#FFF1EFBD" AllowDrop="True"
    22                  PreviewMouseLeftButtonDown="listBox_PreviewMouseLeftButtonDown"/>
    23     </Grid>
    24 </Window>

    二、代码部分

    后台代码
     1 using System;
     2 using System.Collections.ObjectModel;
     3 using System.Windows;
     4 using System.Windows.Controls;
     5 using System.Windows.Input;
     6 using System.Windows.Media;
     7 
     8 namespace WpfDragDropGrid
     9 {
    10     /// <summary>
    11     /// MainWindow.xaml 的交互逻辑
    12     /// </summary>
    13     public partial class MainWindow : Window
    14     {
    15         ObservableCollection<Record> recordLeftList = new ObservableCollection<Record>();
    16         ObservableCollection<Record> recordRightList = new ObservableCollection<Record>();
    17         public MainWindow()
    18         {
    19             InitializeComponent();
    20         }
    21 
    22         private void Window_Loaded(object sender, RoutedEventArgs e)
    23         {
    24             listBox.ItemsSource = recordLeftList;
    25             listBox.DisplayMemberPath = "devname";
    26             dgRight.ItemsSource = recordRightList;
    27             Random ran = new Random();
    28             for (int i = 0; i < 10; i++)
    29             {
    30                 recordLeftList.Add(new Record() { devname="dev"+i,spot1=ran.Next(1,100),spot2=ran.Next(1,100),spot3=ran.Next(1,100)});
    31             }
    32         }
    33 
    34         private void listBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    35         {
    36             Point pos = e.GetPosition(listBox);
    37             HitTestResult result = VisualTreeHelper.HitTest(listBox, pos);
    38             if (null == result) return;
    39 
    40             ListBoxItem listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit); // Find your actual visual you want to drag
    41             if (listBoxItem == null || listBoxItem.Content != listBox.SelectedItem || !(listBox.SelectedItem is Record))
    42                 return;
    43 
    44             Record record = listBoxItem.Content as Record;
    45             DataObject dataObject = new DataObject(record);
    46             // Here, we should notice that dragsource param will specify on which 
    47             // control the drag&drop event will be fired
    48             System.Windows.DragDrop.DoDragDrop(listBox, dataObject, DragDropEffects.Copy);
    49             
    50         }
    51 
    52         private void dgRight_Drop(object sender, DragEventArgs e)
    53         {
    54             Point pos = e.GetPosition(dgRight);
    55             HitTestResult result = VisualTreeHelper.HitTest(dgRight, pos);
    56             if (result == null)
    57                 return;
    58 
    59             Record sourceRecord = e.Data.GetData(typeof(Record)) as Record;
    60             if (sourceRecord != null)
    61                 recordRightList.Add(sourceRecord);
    62         }
    63     }
    64 
    65     //工具类方法,来自网络(很通用,所以借鉴于此,多谢原创)
    66     internal static class Utils
    67     {
    68         //根据子元素查找父元素
    69         public static T FindVisualParent<T>(DependencyObject obj) where T : class
    70         {
    71             while (obj != null)
    72             {
    73                 if (obj is T)
    74                     return obj as T;
    75 
    76                 obj = VisualTreeHelper.GetParent(obj);
    77             }
    78             return null;
    79         }
    80     }
    81 
    82     //实体类
    83     public class Record
    84     {
    85         public string devname
    86         { get; set; }
    87 
    88         public double spot1
    89         { get; set; }
    90 
    91         public double spot2
    92         { get; set; }
    93 
    94         public double spot3
    95         { get; set;  }
    96     }
    97 }
  • 相关阅读:
    题解——洛谷P3812【模板】线性基
    题解——洛谷P2781 传教(线段树)
    题解——洛谷P1962 斐波那契数列(矩阵乘法)
    题解——洛谷P3390 【模板】矩阵快速幂(矩阵乘法)
    题解——牛客网OI赛制测试赛2
    题解——code[vs] 1506 传话(传递闭包)
    题解——Codeforces Round #508 (Div. 2) T3 (贪心)
    题解——Codeforces Round #508 (Div. 2) T2 (构造)
    题解——Codeforces Round #508 (Div. 2) T1 (模拟)
    题解——Codeforces Round #507 (based on Olympiad of Metropolises) T2(模拟)
  • 原文地址:https://www.cnblogs.com/liancs/p/2660322.html
Copyright © 2011-2022 走看看