독개

[Avalonia] Open File Dialog Use Example

by #독개#

아발로니아 프레임워크에 대한 정보가 참 국내에는 없다..

winform이면 몇 줄이면 될걸.. 검색해도 해도 안나오고 허접한 api문서까지..

 

private async Task GetWavHeader()
     {
         var dlg = new OpenFileDialog();
         dlg.Filters.Add(new FileDialogFilter() { Name = "Image Files", Extensions = { "png","gif","jpg" } }); //확장자
         dlg.Filters.Add(new FileDialogFilter() { Name = "All Files", Extensions = { "*" } });
         dlg.AllowMultiple = true; //멀티선택을 가능하게해준다
         string[] result = await dlg.ShowAsync(this); //멀티선택시 string[]배열로 각 경로를 받아온다
         textOutput.Text = result[0]; //textOutput은 출력텍스트박스
 
     }

 

문제발생

문제가 발생했다 ViewModel에서 바인딩으로 실행시키려 하니 ShowAsync의 아규먼트가 Window여야 하는데여기선 MainWindow의 주소를 우리가 몰라서 this 이렇게 하니 오류가났다

해결

MainWindow에서 DataContext에서 MainWindowviewModel을 생성할때 자신의 주소를 같이 넣어준다

 

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel(this); //뷰모델에서 주소를받기위해 추가함
    }
}

 

partial class MainWindowViewModel
{
    //window 함수로 메인윈도우의 주소를 가져온다
    private readonly Window MainWindow;

        
    public MainWindowViewModel(Window mainWindow) //이렇게 하면 생성할때 생성자의 주소를 가져올수 있다 MainWindow에서 생성할때 new MainWindowviewModel(this)해줄것
    {
        MainWindow = mainWindow;
    }
    //기본생성자가 없으면 아발로니아 디자인프리뷰가안된다, Design.Datacontext에서 기본생성자로 생성하기때문
    public MainWindowViewModel()
    {
        
    }
    
    private string _SourceAhkFilePath;
    public string SourceAhkFilePath { get => _SourceAhkFilePath; set { this.RaiseAndSetIfChanged(ref _SourceAhkFilePath, value); } }

    private string _CompileDirPath;
    public string CompileDirPath { get => _CompileDirPath; set { this.RaiseAndSetIfChanged(ref _CompileDirPath, value); } }

  //파일경로를 가져온다
  //public으로 할시 비동기함수도 Binding으로 바로가져올수있다
    public async Task GetSourceAhkFile()
    {
        var dlg = new OpenFileDialog();
        dlg.Filters.Add(new FileDialogFilter() { Name = "Ahk Files", Extensions = { "ahk" } }); //확장자
        dlg.Filters.Add(new FileDialogFilter() { Name = "All Files", Extensions = { "*" } });
        // dlg.AllowMultiple = true; //멀티선택을 가능하게해준다
        string[] result = await dlg.ShowAsync(MainWindow); //멀티선택시 string[]배열로 각 경로를 받아온다
        SourceAhkFilePath = result[0]; // 파일경로 출력
    }
    
    //폴더경로를 가져온다
    
    public async Task GetCompileDirPath()
    {
        var dlg = new OpenFolderDialog();
        string result = await dlg.ShowAsync(MainWindow);
        CompileDirPath = result; 
    }

}

 

 

 

블로그의 정보

독한 개발자

#독개#

활동하기