WPF,strackpanel 拖拽控件 改名

https://download.csdn.net/download/sinat_30224769/13778570

 

 

界面

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d" x:Name="uc"
        Title="MainWindow" Height="450" Width="800"  Loaded="Window_Loaded">
    <Window.Resources>
        <ControlTemplate x:Key="ssss1" TargetType="{x:Type Control}">
            <Grid>

                <Button Content="{Binding Content}" Tag="{Binding .}" Height="50" Width="200"  
             
                    
                    />

                <Grid
                     Tag="{Binding .}"
                    Background="Transparent"
                    PreviewMouseLeftButtonDown="sp_PreviewMouseLeftButtonDown" 
                    PreviewMouseLeftButtonUp="sp_PreviewMouseLeftButtonUp" 
                    PreviewMouseMove="sp_PreviewMouseMove"
                    Drop="sp_Drop" 
                    DragEnter="sp_DragEnter" 
                    />

            </Grid>
        </ControlTemplate>

        <ControlTemplate x:Key="ssss2" TargetType="{x:Type Control}">
            <TextBox Text="{Binding Content}" Tag="{Binding .}" SelectedText=""  
                     AutoWordSelection="True" 
                     LostFocus="TextBox_LostFocus" 
                     KeyUp="TextBox_KeyUp"  Height="50" Width="200" />
        </ControlTemplate>
    </Window.Resources>
    <Grid>

        <ItemsControl x:Name="sp22"  ItemsSource="{Binding ItemSource,ElementName=uc}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Control Tag="{Binding .}"  >
                        <Control.Style>
                            <Style  TargetType="{x:Type Control}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsEditing}" Value="false">
                                        <Setter Property="Template" Value="{StaticResource ssss1}"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding IsEditing}" Value="true">
                                        <Setter Property="Template" Value="{StaticResource ssss2}"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Control.Style>
                    </Control>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>

                <ItemsPanelTemplate>
                    <StackPanel 
                                 AllowDrop="True" 
                        />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>
</Window>

 

后台

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<ItemInfo> list = new List<ItemInfo>();
            for (int i = 0; i < 10; i++)
            {
                list.Add(new ItemInfo() { Content = i.ToString() });
            }

            ItemSource = new ObservableCollection<ItemInfo>(list);
        }


        public class ItemInfo : GalaSoft.MvvmLight.ObservableObject
        {
            private string _Content;

            public string Content { get => _Content; set => Set(ref _Content, value); }


            private bool _IsEditing;

            public bool IsEditing { get => _IsEditing; set => Set(ref _IsEditing, value); }

        }

        public ObservableCollection<ItemInfo> ItemSource
        {
            get { return (ObservableCollection<ItemInfo>)GetValue(ItemSourceProperty); }
            set { SetValue(ItemSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ItemSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemSourceProperty =
            DependencyProperty.Register("ItemSource", typeof(ObservableCollection<ItemInfo>), typeof(MainWindow), new PropertyMetadata(null));



        //按下并拖动
        //按下且

        private bool _isDown;
        private bool _isDragging;
        private int index_From;

        private void sp_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

            _isDown = true;
            var button = e.Source as FrameworkElement;
            var das = button.DataContext as ItemInfo;
            index_From = ItemSource.IndexOf(das);

            if (e.ClickCount == 2)
            {
                _isDragging = false;
                _isDown = false;
                das.IsEditing = true;
            }
        }

        private void sp_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _isDown = false;
            _isDragging = false;
        }

        private void sp_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (_isDown)
            {
                var noediting = !ItemSource.Any(x => x.IsEditing);
                if (_isDragging == false && noediting)
                {
                    _isDragging = true;
                    UIElement _dummyDragSource = new UIElement();
                    if (!ItemSource.Any(x => x.IsEditing))
                    {
                        DragDrop.DoDragDrop(_dummyDragSource, new DataObject("UIElement", e.Source, true), DragDropEffects.Move);
                    }
                }
            }
        }

        private void sp_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("UIElement"))
            {
                e.Effects = DragDropEffects.Move;
            }
        }

        private void sp_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("UIElement"))
            {
                FrameworkElement droptarget = e.Source as FrameworkElement;

                var das = droptarget.DataContext as ItemInfo;
                int droptargetIndex = ItemSource.IndexOf(das);
                if (droptargetIndex != -1)
                {
                    var objFrom = ItemSource[index_From];
                    this.ItemSource.Remove(objFrom);
                    this.ItemSource.Insert(droptargetIndex, objFrom);
                }

                _isDown = false;
                _isDragging = false;

            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = (sender as FrameworkElement);
            var tag = button.Tag as ItemInfo;
            MessageBox.Show(tag.Content);
        }

        private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            FrameworkElement button = sender as FrameworkElement;
            var dc = button.Tag as ItemInfo;
            dc.IsEditing = true;
        }


        private void TextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            FrameworkElement textBox = sender as FrameworkElement;
            var dc = textBox.Tag as ItemInfo;
            if (dc.IsEditing)
            {
                dc.IsEditing = false;
            }
        }

        private void TextBox_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                FrameworkElement textBox = sender as FrameworkElement;
                var dc = textBox.Tag as ItemInfo;
                if (dc.IsEditing)
                {
                    dc.IsEditing = false;
                }
            }
        }
    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF ,可以使用鼠标事件和 Canvas.SetLeft / Canvas.SetTop 方法来实现拖动控件在 Canvas 上移动的效果。以下是一个示例: ```xaml <Canvas> <Button Content="Drag me!" Canvas.Left="50" Canvas.Top="50" MouseLeftButtonDown="Button_MouseLeftButtonDown" MouseMove="Button_MouseMove" MouseLeftButtonUp="Button_MouseLeftButtonUp"/> </Canvas> ``` 在代码,我们为 Button 控件注册了三个鼠标事件:MouseLeftButtonDown、MouseMove 和 MouseLeftButtonUp。这三个事件将分别在鼠标按下、移动和松开时触发。 ```csharp private bool isDragging; private Point startPoint; private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // 开始拖动 isDragging = true; startPoint = e.GetPosition(null); ((UIElement)sender).CaptureMouse(); } private void Button_MouseMove(object sender, MouseEventArgs e) { if (isDragging) { // 计算拖动距离 Point mousePos = e.GetPosition(null); Vector diff = startPoint - mousePos; // 移动控件 Button button = sender as Button; double left = Canvas.GetLeft(button); double top = Canvas.GetTop(button); Canvas.SetLeft(button, left - diff.X); Canvas.SetTop(button, top - diff.Y); // 更新起始点 startPoint = mousePos; } } private void Button_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { // 结束拖动 isDragging = false; ((UIElement)sender).ReleaseMouseCapture(); } ``` 在这个示例,我们首先定义了两个变量:isDragging 和 startPoint。isDragging 变量表示当前是否正在拖动控件,startPoint 变量表示拖动开始时鼠标的位置。 在 MouseLeftButtonDown 事件,我们将 isDragging 设为 true,并记录当前鼠标的位置。然后,我们调用 CaptureMouse 方法来捕获鼠标,以确保鼠标移动事件被正确处理。 在 MouseMove 事件,我们首先判断当前是否正在拖动。如果是,就计算出当前鼠标位置和上一次鼠标位置的差值,然后使用 Canvas.SetLeft 和 Canvas.SetTop 方法更新控件的位置。最后,我们将当前鼠标位置保存到 startPoint 变量,以便下一次计算差值。 在 MouseLeftButtonUp 事件,我们将 isDragging 设为 false,并调用 ReleaseMouseCapture 方法来释放鼠标捕获。 通过这种方式,我们就可以实现在 Canvas 上拖动控件移动的效果。如果需要支持多个控件同时拖动,可以使用类似的方法为每个控件注册鼠标事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值