NuGet添加库引用: 确保项目中已经添加了 System.Windows.Interactivity 和 MvvmLightLibs

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

xmlns:command="http://www.galasoft.ch/mvvmlight"

AllowDrop="True"

<!-- 拖拽识别区域 -->
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="DragEnter">
            <command:EventToCommand Command="{Binding DragEnterAndOverCommand}" 
            PassEventArgsToCommand="True"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="DragOver">
            <command:EventToCommand Command="{Binding DragEnterAndOverCommand}" 
            PassEventArgsToCommand="True"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="Drop">
            <command:EventToCommand Command="{Binding DropCommand}" PassEventArgsToCommand="True"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="DragLeave">
            <command:EventToCommand Command="{Binding DragLeaveCommand}" PassEventArgsToCommand="True"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

        <!-- 透明遮罩层 -->
        <Border Grid.ColumnSpan="2" Background="#80808080" Visibility="{Binding IsImport}"/>

    // 是否正在拖放图片
    private string _isImport = "Collapsed";
    public string IsImport
    {
        get => _isImport;
        set => Set(ref _isImport, value, nameof(IsImport));
    }

        public RelayCommand<DragEventArgs> DragEnterAndOverCommand { get; private set; }
        public RelayCommand<DragEventArgs> DropCommand { get; private set; }
        public RelayCommand<DragEventArgs> DragLeaveCommand { get; private set; }

        // 拖拽进入、移动
        DragEnterAndOverCommand = new RelayCommand<DragEventArgs>(DragEnterAndOver);
        // 拖拽放入
        DropCommand = new RelayCommand<DragEventArgs>(Drop);
        // 拖拽离开
        DragLeaveCommand = new RelayCommand<DragEventArgs>(DragLeave);


        // 拖拽进入、移动
        private void DragEnterAndOver(DragEventArgs e)
        {
            // 检查拖入的数据是否为文件类型
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                IsImport = "Visible";
                e.Effects = DragDropEffects.Copy; // 显示复制的鼠标样式
            }
            else
            {
                IsImport = "Collapsed";
                e.Effects = DragDropEffects.None; // 显示禁止的鼠标样式
            }

            e.Handled = true;
        }

        // 拖拽放入
        private void Drop(DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                try
                {
                    // 获取拖放的所有文件路径
                    string[] selectFiles = (string[])e.Data.GetData(DataFormats.FileDrop);

                    // 定义支持的文件扩展名列表
                    string[] extensions = new string[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp", ".ico" };

                    List<string> imageFiles = new List<string>();
                    HashSet<string> existingFiles = new HashSet<string>(ImagePaths);

                    // 遍历所有拖放的文件和文件夹
                    foreach (var path in selectFiles)
                    {
                        if (Directory.Exists(path))
                        {
                            // 如果是文件夹,递归获取所有图片文件
                            Stack<string> dirs = new Stack<string>(new string[] { path });

                            while (dirs.Count > 0)
                            {
                                string currentDir = dirs.Pop();
                                try
                                {
                                    foreach (var file in Directory.GetFiles(currentDir))
                                    {
                                        if (extensions.Contains(Path.GetExtension(file).ToLower()) && !existingFiles.Contains(file))
                                        {
                                            imageFiles.Add(file);
                                            existingFiles.Add(file);
                                        }
                                    }

                                    foreach (var subDir in Directory.GetDirectories(currentDir))
                                    {
                                        dirs.Push(subDir);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    // 处理文件夹读取异常
                                    HandyControl.Controls.MessageBox.Show($"读取文件夹时出现错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                                }
                            }
                        }
                        else if (File.Exists(path))
                        {
                            // 如果是文件,检查扩展名并添加到图片列表中
                            if (extensions.Contains(Path.GetExtension(path).ToLower()) && !existingFiles.Contains(path))
                            {
                                imageFiles.Add(path);
                                existingFiles.Add(path);
                            }
                        }
                    }

                    if (SequentialTypesetting)
                    {
                        // 添加符合扩展名的文件到 ImagePaths 列表中
                        foreach (var file in imageFiles)
                        {
                            ImagePaths.Add(file);
                        }
                    }
                    else if (RandomTypesetting)
                    {
                        // 创建Random实例
                        var random = new Random();

                        // 打乱文件列表
                        var shuffledFiles = imageFiles.OrderBy(x => random.Next()).ToList();

                        // 将列表分割为两部分
                        int middle = shuffledFiles.Count / 2;
                        var firstHalf = shuffledFiles.Take(middle).ToList();
                        var secondHalf = shuffledFiles.Skip(middle).ToList();

                        // 交错合并两个列表
                        var mixedFiles = new List<string>();
                        int maxLength = Math.Max(firstHalf.Count, secondHalf.Count);
                        for (int i = 0; i < maxLength; i++)
                        {
                            if (i < secondHalf.Count)
                                mixedFiles.Add(secondHalf[i]);
                            if (i < firstHalf.Count)
                                mixedFiles.Add(firstHalf[i]);
                        }

                        // 保存文件路径
                        foreach (var file in mixedFiles)
                        {
                            ImagePaths.Add(file);
                        }
                    }

                    // 标记事件已处理
                    e.Handled = true;

                    // 导入图片数量
                    ImportedImagesCount = ImagePaths.Count;

                    if (StitchableImagesCount == 0 || StitchAfterNImages == 0)
                    {
                        // 拼接图片数量
                        StitchableImagesCount = 1;
                    }
                    else
                    {
                        // 可拼接图片数量
                        StitchableImagesCount = (int)Math.Ceiling((double)ImportedImagesCount / StitchAfterNImages);
                    }
                    // 显示返回按钮
                    BackVisible = "Visible";

                    // 检查是否有图片文件
                    if (ImagePaths.Any())
                    {
                        IsEnableParameter = true;

                        IsImageWatermarkSelected = false;
                        IsTextWatermarkSelected = false;

                        WatermarkImagePath = "";
                        WatermarkImageWidth = 0;
                        WatermarkImageHeight = 0;

                        WatermarkText = "";
                        FontType = "微软雅黑";
                        FontSize = 30;
                        TextColor = "#FFFFFF";

                        WatermarkRotationAngle = 0;
                        WatermarkOpacity = 100;
                        WatermarkPosition = "右下";
                        WatermarkSpacing = 200;

                        Preview();
                    }
                    else
                    {
                        IsEnableParameter = false;
                        HandyControl.Controls.MessageBox.Show("所选文件夹中没有找到任何图片文件!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
                        SelectedFolderPath = string.Empty;
                    }
                }
                catch (Exception ex)
                {
                    IsEnableParameter = false;
                    HandyControl.Controls.MessageBox.Show($"加载图片路径时出现错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                    // 标记事件已处理
                    e.Handled = true;
                }
                finally
                {
                    IsImport = "Collapsed";
                }
            }
        }

        // 拖拽离开
        private void DragLeave(DragEventArgs e)
        {
            IsImport = "Collapsed";
            e.Handled = true;
        }

标签: none

添加新评论