WPF之实现控件内容拖动

以下分别记录label、listbox、treeview三个控件的拖动示例:

1.对被拖动控件,实现拖动事件,主要是通过各种鼠标事件,实现DragDrop.DoDragDrop方法。

2.对于需要拖动到的目的控件,需要实现AllowDrop="True" Drop="TargetLabel_Drop"

   <Window.Resources>
        <Style TargetType="ListBoxItem">
            <EventSetter Event="PreviewMouseMove" Handler="ListBox_PreviewMouseMove"/>
        </Style>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="PreviewMouseMove" Handler="TreeView_PreviewMouseMove"/>
        </Style>

    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="7*"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <Label Name="Label" Margin="5,10" Content="This is Label" MouseDown="Label_MouseDown"/>
            <ListBox Margin="5,10">
                <ListBoxItem>000</ListBoxItem>
                <ListBoxItem>111</ListBoxItem>
                <ListBoxItem>222</ListBoxItem>
            </ListBox>
            <TreeView Name="treeView" Margin="5,10">
                <TreeViewItem Header="aa">
                    <TreeViewItem Header="00"/>
                    <TreeViewItem Header="11"/>
                    <TreeViewItem Header="22"/>
                </TreeViewItem>
            </TreeView>
            <Button Height="30" Margin="5,10" Name="btn" Content="Rest" Click="btn_Click"/>
        </StackPanel>
        <Rectangle Grid.Column="1" Fill="Red" Width="1"/>
        <Label Name="TargetLabel" Grid.Column="2" Content="Come here"  Background="AliceBlue" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" AllowDrop="True" Drop="TargetLabel_Drop"/>
    </Grid>
  private void TargetLabel_Drop(object sender, DragEventArgs e)
        {
            var txt = e.Data.GetData(DataFormats.Text);
            this.TargetLabel.Content = txt;
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            this.TargetLabel.Content = "Come here";
        }

        private void Label_MouseDown(object sender, MouseButtonEventArgs e)
        {
            DragDrop.DoDragDrop(Label, Label.Content, DragDropEffects.Copy);
        }

        private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            var item = sender as ListBoxItem;
            DragDrop.DoDragDrop(item, item.Content, DragDropEffects.Copy);
        }

        private void TreeView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton==MouseButtonState.Released)
            {
                return;
            }

            var t = sender as TreeView;
            var x = this.treeView.SelectedItem;
            if (x==null)
            {
                return;
            }
            var item = x as TreeViewItem;
            DragDrop.DoDragDrop(item, item.Header, DragDropEffects.Copy);
        }

原文地址:https://www.cnblogs.com/qcst123/p/12071480.html

时间: 2024-08-29 00:07:41

WPF之实现控件内容拖动的相关文章

在WPF程序中将控件所呈现的内容保存成图像(转载)

在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控件所呈现的内容保存成图像保存下来,例如:InkCanvas的手写墨迹,WebBrowser中的网页等.可能有人会说,这个不就是截图嘛,找到控件的坐标和大小,调用截图API不就可以了嘛.的确,对于规则的控件来说,通过截图的却可以实现,可是,如果控件不规则或不透明度不是100%,则会把其背景控件的视觉效

WPF打印控件内容

当我们想打印控件内容时,如一个Grid中的内容,可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下: XAML代码如下 1 <Grid> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition/> 4 <ColumnDefinition Width="300"/> 5 </Grid.ColumnDefinitions> 6 <Grid Grid.C

WPF控件内容自动缩放

一.功能.布局描述 1.使用Grid的GridSplitter实现可拖拽分隔栏效果.当ShowsPreview设置为True时,拖拽过程中不会刷新(控件内容要等到鼠标释放时才变化):当ShowsPreview设置为False时,控件内容实时跟随变化. 2.使用ViewBox特性实现控件内容随拖拽自动变化. 3.布局代码: <Grid> <Grid.RowDefinitions> <RowDefinition Height="40"/> <Row

WPF 添加ACTIVEX 控件 ——System.Windows.Forms.AxHost+InvalidActiveXStateException异常

---恢复内容开始--- 一.ACTIVEX及其相关概念 COM(Component Object Model,对象组件模型): DCOM(Distributed COM,分布式对象组件模型): CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构): 动态数据交换(Dynamic Data Exchange,DDE),解决了数据的更新,但数据格式仍是问题: 对象的链接与嵌入(Object Linking and Embedde

wpf 中DataGrid 控件的样式设置及使用

本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </summary> public class Experience { /// <summary> /// 获取或设置工作的起始时间 /// </summary> public string Start { get; set; } /// <summary> /// 获

wpf 自定义RadioButton控件样式

实现的效果为: 我感觉来自定义RadioButton样式和定义button空间的样式差不多,只是类型不同而已. 接下来分析一下样式代码: <!--自定义单选按钮样式-->        <Style TargetType="RadioButton"> <Setter Property="Template">                <Setter.Value>                    <Con

WPF多线程访问控件

大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1 2 1)第一种方法,使用委托: 3 private delegate void SetTextCallback(string text); 4 private void SetText(string text) 5 { 6 // InvokeRequired需要比较调用线程ID和创建线程ID 7 // 如果它们不相同则返回true 8 if (thi

WPF中Ribbon控件的使用

这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可以找到想要的Menu.在Outlook 2003时代,将Home下面的Menu都垂直的排列下来,操作的便捷程度降低了很多.Ribbon的布局会随着窗体的变化动态的调整. 上面的图片中标注了Ribbon的4个区块. 下面我们就在WPF中使用Ribbon控件来实现一个简单的界面. 1. 添加System

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(