첨부 소스 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ 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 이벤트를 사용해 파일 드래그 &amp; 드롭 사용하기"
    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
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요