반응형
외부의 파일을 종종 프로그램 내부로 가져와서 쓸때가 있다. 보통은 File Open Dialog등을 이용하여 가져올수도 있지만 그냥 파일 탐색기에서 여러 파일들을 선택해서 Drag & Drop형태로 가져올 때도 있다.
이럴때 Behavior를 이용하여 File Drop을 사용하는 방법을 알아보자.
1. 우선 Drag & Drop의 영역을 선언해주고 Drop을 가능하도록 처리해준다. AllowDrop=True
<Grid AllowDrop="True">
<!--Drag & Drop 할 공간-->
</Grid>
2. 바인딩할 Behavior 클래스를 만든다.
class FileDropBehavior : Behavior<FrameworkElement>
{
public static readonly DependencyProperty DroppedFilesProperty = DependencyProperty.Register("DroppedFiles", typeof(string[]), typeof(FileDropBehavior), new PropertyMetadata(default(string[])));
public string[] DroppedFiles
{
get { return (string[])GetValue(DroppedFilesProperty); }
set { SetValue(DroppedFilesProperty, value); }
}
protected override void OnAttached()
{
AssociatedObject.Drop += AssociatedObjectDrop;
}
private void AssociatedObjectDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
DroppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
}
}
protected override void OnDetaching()
{
AssociatedObject.Drop -= AssociatedObjectDrop;
}
}
위에 보는것과 같이 Drop된 Object가 File Drop인지 파악하고 만약 맞다면 해당 파일의 Path를 가지고 오도록 처리한다.
그리고 외부에서 바인딩 할 수 있도록 만든 DroppedFiles 변수에 집어 넣는다.
외부에서 이 클래스를 사용하여 바인딩할 경우, FileDrop이 일어나면 DroppedFiles에 File Path들이 갱신 될 것이다.
3. Xaml을 작성한다.
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:behavior="clr-namespace:SampleProject.ViewModel.Behavior"
우선 Behaviors를 사용하기 위해서 상단에 위와 같이 xaml에 선언해준다.
그리고 2번에서 작성한 Behavior 클래스를 사용할 수 있도록 선언한다.
<Grid AllowDrop="True">
<i:Interaction.Behaviors>
<behavior:FileDropBehavior DroppedFiles="{Binding DroppedFiles, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
</Grid>
그리고 VM에서 DroppedFiles가 변경될때마다 원하는 작업을 해주면 끝!!
반응형
'프로그래밍 > WPF' 카테고리의 다른 글
[WPF] Close popup when mouse leave (0) | 2022.12.20 |
---|---|
[WPF] Binding SelectedItems (ItemsControl, DataGrid 등) (0) | 2022.12.07 |
[WPF] Return StaticResource as IValueConverter (0) | 2022.12.02 |
[WPF] ContextMenu Binding in TreeView (0) | 2022.11.28 |
[WPF] Value Converter Default (0) | 2022.11.04 |