拖放到usercontrol内部不起作用的文本框

时间:2014-04-16 06:08:08

标签: c# wpf

我在usercontrol中有一个文本框和按钮。 usercontrol位于主窗口的ContentControl中

<TextBox x:Name="FilePathTextBox" Grid.Column="0" HorizontalAlignment="Stretch" Margin="0,0,5,0" Text="{Binding SurfaceFile, Mode=TwoWay}" MinWidth="150"
                     AllowDrop="True"  PreviewDragEnter="TextBox_PreviewDragEnter" PreviewDragOver="TextBox_PreviewDragEnter" PreviewDrop="TextBox_PreviewDrop"></TextBox>

我在xaml.cs中有以下代码

        private string[] allowedFileExtensions = { ".XML", ".TXT"};

        bool Is_AllowedFile(string fileExtension)
        {
            return allowedFileExtensions.Contains(fileExtension, StringComparer.OrdinalIgnoreCase);
        }


        private void TextBox_PreviewDragEnter(object sender, DragEventArgs e)
        {
            bool dropEnabled = true;

            if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
            {
                string[] droppedFilePaths = e.Data.GetData(DataFormats.FileDrop, true) as string[];

                if (droppedFilePaths.Count() > 1 || !Is_AllowedFile(System.IO.Path.GetExtension(droppedFilePaths[0])))
                    dropEnabled = false;
            }
            else
            {
                dropEnabled = false;
            }

            if (!dropEnabled)
            {
                e.Effects = DragDropEffects.None;
                e.Handled = true;
            }
        }

        private void TextBox_PreviewDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] droppedFilePaths = e.Data.GetData(DataFormats.FileDrop, true) as string[];

                FilePathTextBox.Text = droppedFilePaths[0];
            }
        }

TextBox_PreviewDrop永远不会被触发。 这个实现是正确的还是有一个更好/更简单的解决方案? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该将PreviewDragEnter处理程序结束时的条件更改为:

if (dropEnabled)
{           
  e.Effects = DragDropEffects.All;
  e.Handled = true;
}