[C#/WPF] UIElement 클래스 : PreviewDragOver/PreviewDrop 이벤트를 사용해 파일 드래그 & 드롭 사용하기
C#/WPF 2020. 8. 25. 20:31728x90
반응형
728x170
▶ MainWindow.xaml
<Window x:Class="TestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="600"
Title="UIElement 클래스 : PreviewDragOver/PreviewDrop 이벤트를 사용해 파일 드래그 & 드롭 사용하기"
FontFamily="나눔고딕코딩"
FontSize="16">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0"
Orientation="Horizontal"
Background="#cc0088ff">
<Button Name="clearButton"
Margin="10"
Padding="5"
Content="지우기" />
<Border
Margin="10"
BorderBrush="Black"
BorderThickness="1">
<CheckBox Name="wrapContentCheckBox"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Margin="5"
IsChecked="False"
Content="내용 랩핑하기" />
</Border>
<Label Name="messageLabel"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
FontWeight="Bold"
Content="내용을 표시하려면 아래에 단일 파일을 드롭하십시오." />
</StackPanel>
<TextBox Name="contentTextBox" Grid.Row="1"
BorderBrush="Black"
BorderThickness="1"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
AllowDrop="True"
AcceptsReturn="True"
AcceptsTab="True" />
</Grid>
</Window>
728x90
▶ MainWindow.xaml.cs
using System.IO;
using System.Windows;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
if((bool)wrapContentCheckBox.IsChecked)
{
this.contentTextBox.TextWrapping = TextWrapping.Wrap;
}
else
{
this.contentTextBox.TextWrapping = TextWrapping.NoWrap;
}
this.clearButton.Click += clearButton_Click;
this.wrapContentCheckBox.Click += wrapContentCheckBox_Click;
this.contentTextBox.PreviewDragOver += contentTextBox_PreviewDragOver;
this.contentTextBox.PreviewDrop += contentTextBox_PreviewDrop;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 지우기 버튼 클릭시 처리하기 - clearButton_Click(sender, e)
/// <summary>
/// 지우기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void clearButton_Click(object sender, RoutedEventArgs e)
{
this.contentTextBox.Clear();
}
#endregion
#region 내용 랩핑하기 체크 박스 클릭시 처리하기 - wrapContentCheckBox_Click(sender, e)
/// <summary>
/// 내용 랩핑하기 체크 박스 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void wrapContentCheckBox_Click(object sender, RoutedEventArgs e)
{
if((bool)this.wrapContentCheckBox.IsChecked)
{
this.contentTextBox.TextWrapping = TextWrapping.Wrap;
}
else
{
this.contentTextBox.TextWrapping = TextWrapping.NoWrap;
}
}
#endregion
#region 내용 텍스트 박스 프리뷰 드래그 OVER 처리하기 - contentTextBox_PreviewDragOver(sender, e)
/// <summary>
/// 내용 텍스트 박스 프리뷰 드래그 OVER 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void contentTextBox_PreviewDragOver(object sender, DragEventArgs e)
{
if(IsSingleFile(e) != null)
{
e.Effects = DragDropEffects.Copy;
}
else
{
e.Effects = DragDropEffects.None;
}
e.Handled = true;
}
#endregion
#region 내용 텍스트 박스 프리뷰 DROP 처리하기 - contentTextBox_PreviewDrop(sender, e)
/// <summary>
/// 내용 텍스트 박스 프리뷰 DROP 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void contentTextBox_PreviewDrop(object sender, DragEventArgs e)
{
e.Handled = true;
string filePath = IsSingleFile(e);
if(filePath == null)
{
return;
}
StreamReader reader = new StreamReader(filePath);
this.contentTextBox.Text = reader.ReadToEnd();
reader.Close();
this.messageLabel.Content = $"파일 : {filePath}";
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 단일 파일 여부 구하기 - IsSingleFile(e)
/// <summary>
/// 단일 파일 여부 구하기
/// </summary>
/// <param name="e">이벤트 인자</param>
/// <returns>파일 경로</returns>
private string IsSingleFile(DragEventArgs e)
{
if(e.Data.GetDataPresent(DataFormats.FileDrop, true))
{
string[] filePathArray = e.Data.GetData(DataFormats.FileDrop, true) as string[];
if(filePathArray.Length == 1)
{
if(File.Exists(filePathArray[0]))
{
return filePathArray[0];
}
}
}
return null;
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] ControlTemplate 엘리먼트 : RadioButton 엘리먼트 정의하기 (0) | 2020.08.26 |
---|---|
[C#/WPF] 지오메트리 사용하기 (0) | 2020.08.26 |
[C#/WPF] ControlTemplate 엘리먼트 : RadioButton 엘리먼트 정의하기 (0) | 2020.08.25 |
[C#/WPF] LinearGradientBrush 엘리먼트 : 글래스 효과 브러시 만들기 (0) | 2020.08.25 |
[C#/WPF] DrawingBrush 엘리먼트 : GeometryDrawing 객체를 사용해 격자 배경 브러시 만들기 (0) | 2020.08.25 |
[C#/WPF] DrawingContext 클래스 : PushOpacity/Pop 메소드 사용하기 (0) | 2020.08.25 |
[C#/WPF] DrawingContext 클래스 : PushOpacity/Pop 메소드 사용하기 (0) | 2020.08.25 |
[C#/WPF] DrawingBrush 엘리먼트 : GeometryDrawing 객체를 사용해 격자 배경 브러시 만들기 (0) | 2020.08.25 |
[C#/WPF] DrawingBrush 엘리먼트 : GeometryDrawing 객체를 사용해 체크 배경 브러시 만들기 (0) | 2020.08.25 |
[C#/WPF] DrawingImage 클래스 : GlyphRunDrawing 객체를 사용해 이미지 만들기 (0) | 2020.08.25 |
댓글을 달아 주세요