[C# WPF] 외부 파일 실행하기

우롱밀크티당도70·2023년 10월 10일
0

WPF

목록 보기
13/22
post-custom-banner

1. 배경

버튼을 눌러 .txt나 .xlsx같은 확장자를 가진 파일을 연다.


2. 개발환경

  • VisualStudio 2022 / WPF 애플리케이션(.NET Framework 4.7.2)

3. 내용

3-1. 프로젝트 생성 및 폴더 구조

https://velog.io/@yu_oolong/C-WPF-MVVM-패턴으로-프로젝트-시작하기 와 같이 프로젝트를 생성한다.
폴더 구조는 다음과 같다.

3-2. 컨트롤 배치

버튼을 눌러서 외부 파일을 실행하기 위해 화면에 Button 컨트롤을 배치한다.

<Page x:Class="PracticeProject2.Views.Page5"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="clr-namespace:PracticeProject2.Views"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Page5"
      Background="White">

    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Content="Open File" Width="100" Height="50" Cursor="Hand"/>
        </StackPanel>
    </Grid>
</Page>

3-3. RelayCommand, BaseViewModel 작성

  1. Commands 폴더에 RelayCommand.cs 생성하여 작성한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace PackagingSystem.Commands
{
    public class RelayCommand : ICommand
    {
        private readonly Action _execute;
        private readonly Func<bool> _canExecute;

        public RelayCommand(Action execute, Func<bool> canExecute = null)
        {
            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
            _canExecute = canExecute;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter) => _canExecute == null || _canExecute();

        public void Execute(object parameter) => _execute();
    }
}
  1. ViewModels 폴더에 INotifyPropertyChanged를 상속받는 BaseViewModel.cs을 생성하여 작성한다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace PracticeProject2.ViewModels
{
    internal class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        protected bool SetProperty<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(backingField, value)) return false;
            backingField = value;
            OnPropertyChanged(propertyName);
            return true;
        }
    }
}

3-4. BaseViewModel을 상속 받는 ViewModel 작성

  1. View인 page5.xaml의 ViewModel인 Page5ViewModel.cs를 생성한다.
  2. BaseViewModel을 상속 받고 Command를 작성한다.
  3. Process.Start 메서드로 경로에 해당하는 파일을 실행하는 Command이다.
using PracticeProject2.Commands;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace PracticeProject2.ViewModels
{
    internal class Page5ViewModel : BaseViewModel
    {
        public ICommand openFileCommand { get; set; }

        public Page5ViewModel() 
        {
            openFileCommand = new RelayCommand(openFile);
        }

        private void openFile()
        {
            string directory = @"D:\\Edu\\";
            string filename = "memo.txt";
            string filepath = directory + filename;

            Process.Start(filepath);
        }

    }
}

3-5. View의 Button에 Command 바인딩하기

  1. ViewModels 네임스페이스 명시
  2. DataContext 연결하기
  3. Button 컨트롤에 Command Binding하기
<Page x:Class="PracticeProject2.Views.Page5"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:vm="clr-namespace:PracticeProject2.ViewModels"
      xmlns:local="clr-namespace:PracticeProject2.Views"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Page5"
      Background="White">

    <Page.DataContext>
        <vm:Page5ViewModel />
    </Page.DataContext>

    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Content="Open File" Width="100" Height="50" Cursor="Hand" Command="{Binding openFileCommand}"/>
        </StackPanel>
    </Grid>
</Page>

4. 결과



실행 후 버튼을 클릭하면 경로로 지정한 파일인 memo.txt 메모장 파일이 실행됐다.
.xlsx 파일을 경로로 지정하면 엑셀이 실행된다.


5. 참조

Process.Start 메서드

profile
안뇽하세용
post-custom-banner

0개의 댓글