programing

Wpf: 텍스트 상자에 드래그 앤 드롭

padding 2023. 4. 13. 20:39
반응형

Wpf: 텍스트 상자에 드래그 앤 드롭

저는 이 문제를 구글로 검색했고, 사람들은 비슷한 질문에 답했지만, 어떤 이유에서인지 저는 아무것도 할 수 없습니다.뭔가 놓쳤나 봐요어쨌든 다음 코드를 실행하면 TextBox_DragEnter 핸들러가 호출되지 않습니다.그러나 xaml의 TextBox 요소를 TextBlock 요소로 변경하면 호출됩니다.TextBox 요소에서 동일한 동작을 얻을 수 있는 방법이 있습니까?다음 코드는 문제를 완전히 격리합니다.

Main Window.xaml:

<Window x:Class="Wpf1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="myGrid">
        <TextBox AllowDrop="True" PreviewDragEnter="TextBox_DragEnter" PreviewDrop="TextBox_Drop" />
    </Grid>
</Window>

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Collections.ObjectModel;

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

        private void TextBox_DragEnter(object sender, DragEventArgs e)
        {
            e.Effects = DragDropEffects.Copy;
        }

        private void TextBox_Drop(object sender, DragEventArgs e)
        {

        }
    }
}

잘 부탁드립니다!

앤드류

편집:

확실히 하기 위해서, 커스텀 오브젝트를 텍스트 박스에 드롭 할 수 있도록 하고 싶습니다.텍스트 상자의 Drop 핸들러에서 텍스트 상자의 텍스트를 개체 속성으로 설정하고 TextBox의 IsReadOnly 속성을 false로 설정합니다.TextBox에서 드래그 앤 드롭을 활성화하는 데 문제가 좀 있습니다.

PreviewDragOver 핸들러를 추가할 경우 e를 설정합니다.Handled = 작동해야 합니다.

어떤 경우든 내게는 효과가 있다.

TextBox이미 Drag And Drop에 대한 기본 처리가 있는 것 같습니다.데이터 객체가 String일 경우 동작합니다.다른 유형은 처리되지 않고 금지 마우스 효과가 나타나며 드롭 핸들러가 호출되지 않습니다.

사용자 자신의 처리를 활성화 할 수 있을 것 같습니다.e.Handled로.true에 있어서PreviewDragOver이벤트 핸들러

MSDN에서는 자세한 내용은 찾을 수 없었지만, http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF은 매우 도움이 되었습니다.

PreviewDragEnter를 PreviewDragOver와 같은 방법으로 처리할 수도 있습니다.그렇지 않으면 첫 번째 픽셀의 금지 마우스가 기본 설정됩니다.

핸들러에서 DragEventArgs를 확인합니다.데이터는 삭제할 유형입니다.이 경우 DragEventsArgs를 설정합니다.Drag Drop Effects에 대한 효과.AllowedEffects에서 이동 또는 다른 작업을 수행합니다.삭제할 유형이 아닌 경우 DragDropEffects로 설정합니다.드롭을 디세블로 하는 것은 없습니다.

MVVM Light용 XAML:

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Drop">
            <cmd:EventToCommand Command="{Binding DragDropCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
        <i:EventTrigger EventName="PreviewDragOver">
            <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
        <i:EventTrigger EventName="PreviewDragEnter">
            <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

ViewModel의 핸들러:

        private void ExecutePreviewDragEnterCommand(DragEventArgs drgevent)
        {
            drgevent.Handled = true;


            // Check that the data being dragged is a file
            if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // Get an array with the filenames of the files being dragged
                string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop);

                if ((String.Compare(System.IO.Path.GetExtension(files[0]), ".xls", true) == 0)
                    && files.Length == 1)
                    drgevent.Effects = DragDropEffects.Move;
                else
                    drgevent.Effects = DragDropEffects.None;

            }
            else
                drgevent.Effects = DragDropEffects.None;
        }

를 구현하는 자체 텍스트 상자 클래스를 만드는 것이 좋습니다.Textbox그런 다음 OnDrag-Events를 덮어쓰고e.handled로.false하고 싶은 거 다 해

원래 원하는 행동을 위해 만들어지지 않은 이벤트를 사용하는 것은 조금 지저분하다.미리보기는 실제 DragDrop-Events를 커밋하기 전에 몇 가지 사항을 확인하고 실행 취소 옵션을 갖는 것입니다.

언급URL : https://stackoverflow.com/questions/4281857/wpf-drag-and-drop-to-a-textbox

반응형