wpf TelerikUI使用DragDropManager

首先,我先创建事务对象ApplicationInfo,当暴露出一对属性当例子集合对于构成ListBoxes。这个类在例子中显示如下代码:

cs 复制代码
public class ApplicationInfo 
{ 
    public Double Price 
    { 
        get; 
        set; 
    } 
    public String IconPath 
    { 
        get; 
        set; 
    } 
    public String Name 
    { 
        get; 
        set; 
    } 
    public String Author 
    { 
        get; 
        set; 
    } 
    public static ObservableCollection<ApplicationInfo> GenerateApplicationInfos() 
    { 
        ObservableCollection<ApplicationInfo> result = new ObservableCollection<ApplicationInfo>(); 
        ApplicationInfo info1 = new ApplicationInfo(); 
        info1.Name = "Large Collider"; 
        info1.Author = "C.E.R.N."; 
        info1.IconPath = @"img/Atom.png"; 
        result.Add(info1); 
        ApplicationInfo info2 = new ApplicationInfo(); 
        info2.Name = "Paintbrush"; 
        info2.Author = "Imagine Inc."; 
        info2.IconPath = @"img/Brush.png"; 
        result.Add(info2); 
        ApplicationInfo info3 = new ApplicationInfo(); 
        info3.Name = "Lively Calendar"; 
        info3.Author = "Control AG"; 
        info3.IconPath = @"img/CalendarEvents.png"; 
        result.Add(info3); 
        ApplicationInfo info4 = new ApplicationInfo(); 
        info4.Name = "Fire Burning ROM"; 
        info4.Author = "The CD Factory"; 
        info4.IconPath = @"img/CDBurn.png"; 
        result.Add(info4); 
        ApplicationInfo info5 = new ApplicationInfo(); 
        info5.Name = "Fav Explorer"; 
        info5.Author = "Star Factory"; 
        info5.IconPath = @"img/favorites.png"; 
        result.Add(info5); 
        ApplicationInfo info6 = new ApplicationInfo(); 
        info6.Name = "IE Fox"; 
        info6.Author = "Open Org"; 
        info6.IconPath = @"img/Connected.png"; 
        result.Add(info6); 
        ApplicationInfo info7 = new ApplicationInfo(); 
        info7.Name = "Charting"; 
        info7.Author = "AA-AZ inc"; 
        info7.IconPath = @"img/ChartDot.png"; 
        result.Add(info7); 
        ApplicationInfo info8 = new ApplicationInfo(); 
        info8.Name = "SuperPlay"; 
        info8.Author = "EB Games"; 
        info8.IconPath = @"img/Games.png"; 
        result.Add(info8); 
        return result; 
    } 
} 

然后需要定义ListBoxes对于符合的ItemTemplates。我同样启动拖动ListBoxItems和允许拖动每一个ListBoxes

XML 复制代码
<Grid x:Name="LayoutRoot" Background="White"> 
      <Grid.Resources> 
          <Style TargetType="ListBoxItem"> 
              <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True"></Setter> 
          </Style> 
          <DataTemplate x:Key="ApplicationTemplate"> 
              <StackPanel Orientation="Horizontal"> 
                  <Image Source="{Binding IconPath}"/> 
                  <TextBlock Margin="5" Text="{Binding Name}" VerticalAlignment="Center"></TextBlock> 
              </StackPanel> 
          </DataTemplate> 
       </Grid.Resources> 
       <Grid.ColumnDefinitions> 
           <ColumnDefinition></ColumnDefinition> 
           <ColumnDefinition></ColumnDefinition> 
       </Grid.ColumnDefinitions> 
       <ListBox x:Name="ApplicationList" ItemTemplate="{StaticResource ApplicationTemplate}" AllowDrop="True"/> 
       <ListBox x:Name="MyAppList" Background="Gray" Grid.Column="1"   
                ItemTemplate="{StaticResource ApplicationTemplate}" AllowDrop="True"/> 
</Grid> 

之后我们需要设置控件的ItemSource:

cs 复制代码
ApplicationList.ItemsSource = ApplicationInfo.GenerateApplicationInfos(); 
MyAppList.ItemsSource = new ObservableCollection<ApplicationInfo>(); 

附加拖动处理事件

cs 复制代码
DragDropManager.AddDragInitializeHandler(ApplicationList, OnDragInitialize); 
DragDropManager.AddDragInitializeHandler(MyAppList, OnDragInitialize); 
 
DragDropManager.AddGiveFeedbackHandler(ApplicationList, OnGiveFeedback); 
DragDropManager.AddGiveFeedbackHandler(MyAppList, OnGiveFeedback); 
 
DragDropManager.AddDragDropCompletedHandler(ApplicationList, OnDragCompleted); 
DragDropManager.AddDragDropCompletedHandler(MyAppList, OnDragCompleted); 
 
DragDropManager.AddDropHandler(ApplicationList, OnDrop); 
DragDropManager.AddDropHandler(MyAppList, OnDrop);   

然后在DraInitialize定义数据当拖动后,同时呈现。同样设置了DragDropEffects到所有允许拖动的场景

cs 复制代码
private void OnDragInitialize(object sender, DragInitializeEventArgs args) 
{ 
    args.AllowedEffects = DragDropEffects.All; 
    var payload = DragDropPayloadManager.GeneratePayload(null); 
    var data = ((FrameworkElement)args.OriginalSource).DataContext; 
    payload.SetData("DragData", data); 
    args.Data = payload; 
    args.DragVisual = new ContentControl { Content = data, ContentTemplate = LayoutRoot.Resources["ApplicationTemplate"] as DataTemplate }; 
} 

同样设置鼠标光标为箭头:

cs 复制代码
private void OnGiveFeedback(object sender, Telerik.Windows.DragDrop.GiveFeedbackEventArgs args) 
{ 
    args.SetCursor(Cursors.Arrow); 
    args.Handled = true; 
} 

最后添加逻辑,将在拖动后允许完成操作:

cs 复制代码
private void OnDrop(object sender, Telerik.Windows.DragDrop.DragEventArgs args) 
{ 
    var data = ((DataObject)args.Data).GetData("DragData"); 
    ((IList)(sender as ListBox).ItemsSource).Add(data); 
} 
 
public void OnDragCompleted(object sender, Telerik.Windows.DragDrop.DragDropCompletedEventArgs args) 
{ 
    var data = DragDropPayloadManager.GetDataFromObject(args.Data, "DragData"); 
    ((IList)(sender as ListBox).ItemsSource).Remove(data); 
} 

拖动如下ListBoxes

相关推荐
东风微鸣几秒前
把 Tailscale 接进 Prometheus 监控
java·数据库·prometheus
看浪的路人14 分钟前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
临床数据科学和人工智能兴趣组25 分钟前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
大侠归来25 分钟前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
蜗牛互联网25 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
SEO_juper41 分钟前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
Wang's Blog1 小时前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
今年下半年1 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
盛世宏博北京1 小时前
十二防档案库房总线架构设计:恒湿消毒净化一体机 RS485 组网实战笔记
开发语言·笔记·php·恒湿机·档案八防温湿度