Windows GUI 프로그래밍 시작 14 처리 중 표시

11483 단어 GUIWindowsWPF입문C#

■소개



이전 프로그램은 큰 CSV를 로드하면 로드 완료까지 화면이 굳어져 버립니다.
그래서 이번에는 그 대책을 합니다.

키워드: TaskbarItemInfo, async, await, 문서 개요

[주의]
지금까지 설명한 조작 방법 등은 설명을 생략하거나 간략화하는 경우가 있습니다.

■ 개발 환경


  • Windows 10(버전 1703)
  • Visual Studio Community 2017
  • .NET Framework 4.x

  • ■ 만들어 보자



    ◇처리중 텍스트



    문서 개요에서 listView 눈 아이콘을 클릭하여 목록 보기를 숨깁니다.


    TextBlock 를 목록 뷰가 있는 그리드 행(Row=1)에 배치합니다.


    TextBlock를 마우스 오른쪽 버튼으로 클릭하고 '레이아웃'- '모두 재설정'하고,x:NameloadingText 로 하고,
    속성의
    레이아웃 - HorizontalAlignmentVerticalAlignmentCenter로,
    「텍스트」의 FontSize48 px 에,
    공통의 Text読み込み中・・・로 설정합니다.


    TextBlock 의 속성 「외관」의 VisibilityCollapsed 로 해서 숨깁니다.
    TextBlock 설정이 끝났으므로 문서 개요에서 listView를 숨기십시오.

    지금까지 TextBlock의 정의는 다음과 같습니다.
    <TextBlock x:Name="loadingText" Grid.Row="1" TextWrapping="Wrap" Text="読み込み中・・・" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Visibility="Collapsed"/>
    

    ◇처리중 태스크 바


    MainWindow 에 작업 표시줄 처리 중 표시에 대한 정의를 추가합니다.
    <Window.TaskbarItemInfo>
        <TaskbarItemInfo x:Name="taskbarInfo"/>
    </Window.TaskbarItemInfo>
    



    ◇로직



    생성자에 다음 처리를 추가합니다.
    // 複数のスレッドからのアクセスを有効化
    BindingOperations.EnableCollectionSynchronization(this.ZipRecords, new object());
    

    다음 메소드를 추가합니다.
    /// <summary>
    /// データ読み込み中の画面表示
    /// </summary>
    /// <param name="loading">データ読み込み中の時にtrue, 読み込み終わったらfalseを設定する</param>
    private void SetLoadingUI(bool loading)
    {
        if (loading)
        {
            // 処理中
    
            // 画面全体を無効化
            this.IsEnabled = !loading;
            // 処理中メッセージを表示
            loadingText.Visibility = Visibility.Visible;
            // リストを隠す
            listView.Visibility = Visibility.Collapsed;
            // タスクバーアイコンを処理中表示にする
            taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate;
        }
        else
        {
            // 処理終り
    
            // 画面全体を有効化
            this.IsEnabled = !loading;
            // 処理中メッセージを隠す
            loadingText.Visibility = Visibility.Collapsed;
            // リストを表示
            listView.Visibility = Visibility.Visible;
            // タスクバーアイコンを通常に戻す
            taskbarInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.None;
        }
    }
    
    /// <summary>
    /// CSVファイル読み込みタスク
    /// </summary>
    /// <param name="filePath">CSVファイルパス</param>
    /// <returns></returns>
    private Task ReadCsvTask(string filePath)
    {
        return Task.Run(() => { ReadCsv(filePath); });
    }
    
    openMenu_Click 메서드를 수정합니다.

    메소드 정의(수정 전)
    private void openMenu_Click
    

    메소드 정의(수정 후)
    private async void openMenu_Click
    

    CSV 읽기 처리(수정 전)
    this.IsEnabled = false;
    
    // CSV読み込み
    ReadCsv(dlg.FileName);
    
    this.IsEnabled = true;
    

    CSV 읽기 처리(수정 후)
    SetLoadingUI(true);
    
    // CSV読み込み
    await ReadCsvTask(dlg.FileName);
    
    SetLoadingUI(false);
    

    처리의 흐름은 await 를 붙인 ReadCsvTask 메소드가 불려 가면(자) openMenu_Click 메소드를 일단 빠져나갑니다 (다른 병렬로 움직이고 있는 처리가 있으면 그쪽을 합니다).
    그리고, ReadCsvTask 메소드가 종료하면(자) 그 아래의 처리가 실행됩니다.

    여기에서는, 무거운 처리( ReadCsvTask )를 실행하기 직전에 화면을 처리중 표시로 하고, 무거운 처리가 끝나면 처리중 표시를 되돌리고 있습니다.


    ■ 움직여 보자



    실행해 보겠습니다.
    가장 큰 전국 일괄 데이터를 읽어 보겠습니다.


    작업 표시줄 표시,




    처리 중에 바뀌고,


    목록 보기가 숨겨지고 대신 처리 중인 텍스트가 표시됩니다.
    이전과 달리 로드 중에도 창을 이동하거나 크기를 조정할 수 있습니다.


    로드가 끝나면 목록 보기가 표시됩니다.


    오시마

    ■참고 사이트


  • TaskbarItemInfo 클래스 - MSDN


  • << 첫 번째 기사 < 이전 기사 다음 기사 >

    좋은 웹페이지 즐겨찾기