📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の20版が非表示)
181行目: 181行目:
<br><br>
<br><br>


== ファイル保存タイアログ ==
== ファイル選択タイアログ (StorageProviderクラス) ==
==== StorageProviderのプロパティ ====
下表に、ファイル選択ダイアログのプロパティのうち、設定を意識する必要がある主なプロパティを示す。<br>
<br>
<center>表. StorageProviderクラスの主なプロパティ<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | プロパティ名
! style="background-color:#00ffff;" | データ型
! style="background-color:#00ffff;" | 意味
|-
| AllowMultiple || bool || 複数のアイテムの選択を許可するかどうかを指定する。<br>複数のアイテムを選択する場合 : true<br>単一のファイルのみの場合 : false (既定値 : false)
|-
| FileTypeFilter<br><br>(厳密にはプロパティではない) || IReadOnlyList<FilePickerFileType>型 || <code>FilePickerOpenOptions</code>等のオプションクラスのプロパティとして使用する。<br>選択可能なファイルタイプを制限するためのフィルタのリストを指定する。
|-
| SuggestedStartLocation<br><br>(厳密にはプロパティではない) || IStorageFolder型 || ファイルピッカーやフォルダピッカーが開く初期ディレクトリを指定する。<br><code>FilePickerOpenOptions</code>や<code>FolderPickerOpenOptions</code>等のオプションクラスのプロパティとして使用する。<br><br>未指定または<code>null</code>を指定した場合、ファイルピッカーやフォルダピッカーは、システムやアプリケーションのデフォルトの開始位置を使用する。<br>多くの場合、ユーザのドキュメントディレクトリ、または、最後にファイルピッカーを使用した場所になる。
|-
| Title || string || ファイル選択ダイアログのウインドウタイトルを指定する。
|}
</center>
<br>
 
==== FileTypeFilter (ファイルの種類) の設定 ====
ダイアログで開くことができるファイルの種類は、<code>FilePickerOpenOptions</code>クラスの<code>FileTypeFilter</code>プロパティにフィルタ文字列を設定する。<br>
<br>
フィルタ文字列の設定を以下に示す。<br>
* FilePickerOpenOptionsクラス (オプションクラス) の使用
*: FilePickerOpenOptionsクラスのインスタンスを作成し、そのFileTypeFilterプロパティにフィルタを設定する。
*: <br>
* FilePickerFileTypeクラスの使用
*: 各フィルタはFilePickerFileTypeオブジェクトとして定義されます。コンストラクタの引数にフィルタの名前を指定する。
*: <br>
* Patterns
*: Patternsプロパティに、フィルタに含める拡張子のパターンを指定する。
*: <br>
* 複数の拡張子
*: 1つのフィルタに複数の拡張子を含めることができる。
*: 例えば、"HTMLファイル"フィルタでは、"*.html" と "*.htm" の両方を指定する。
*: <br>
* 全てのファイル
*: 全てのファイルを表す場合は、拡張子として "*" を使用する。
*: 例えば、"すべてのファイル"フィルタがこれに該当する。
*: <br>
* フィルタの順序
*: リストに追加した順序でユーザに表示される。
*: 以下の例では、"すべてのファイル"が最初に表示されて、以降"テキストファイル"、"XMLファイル"等の順で表示される。
<br>
この設定により、ユーザは様々なファイルタイプから選択できる。<br>
特定のファイル形式に絞り込む場合や全てのファイルを表示することもできる。<br>
<br>
<br>
<syntaxhighlight lang="c#">
var storageProvider = TopLevel.GetTopLevel(this)?.StorageProvider;
var options = new FilePickerOpenOptions
{
    FileTypeFilter = new[]
    {
      new FilePickerFileType("すべてのファイル") { Patterns = new[] { "*" } },
      new FilePickerFileType("テキストファイル") { Patterns = new[] { "*.txt" } },
      new FilePickerFileType("XMLファイル")    { Patterns = new[] { "*.xml" } },
      new FilePickerFileType("HTMLファイル")    { Patterns = new[] { "*.html", "*.htm" } },
      new FilePickerFileType("Webファイル")    { Patterns = new[] { "*.html", "*.htm", "*.css", "*.js" } },
      new FilePickerFileType("XMLファイルとHTMLファイル") { Patterns = new[] { "*.xml", "*.html", "*.htm" } },
      new FilePickerFileType("イメージファイル") { Patterns = new[] { "*.png", "*.jpg", "*.gif", "*.bmp", "*.webp" } }
    }
};
var file = await storageProvider.OpenFilePickerAsync(options);
</syntaxhighlight>
<br>
 
==== 使用例 ====
以下の例では、FilePickerOpenOptionsクラスを使用してstorageProviderクラスを設定した後、ディレクトリ選択ダイアログを開いている。<br>
<br>
SuggestedStartLocationやFileTypeFilterは、StorageProviderクラスの直接のプロパティではないことに注意する。<br>
<br>
<syntaxhighlight lang="c#">
using Avalonia.Platform.Storage;
using System.IO;
using System.Threading.Tasks;
public class MyClass
{
    public async Task OpenFileAsync()
    {
      var storageProvider = TopLevel.GetTopLevel(this)?.StorageProvider;
      if (storageProvider != null)
      {
          var options = new FilePickerOpenOptions
          {
            SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync($"/usr/local/bin"),
            FileTypeFilter = new[]
            {
                new FilePickerFileType("Text Files") { Patterns = new[] { "*.txt" } },
                new FilePickerFileType("All Files") { Patterns = new[] { "*" } }
            },
            AllowMultiple = false
          };
          var file = await storageProvider.OpenFilePickerAsync(options);
          if (file.Count > 0)
          {  // ファイルが選択された場合の処理
            // ...略
          }
      }
    }
}
</syntaxhighlight>
<br><br>
 
== ファイル保存タイアログ (SaveFileDialogクラス) ==
==== SaveFileDialogのプロパティ ====
==== SaveFileDialogのプロパティ ====
下表に、ファイル選択ダイアログのプロパティのうち、設定を意識する必要がある主なプロパティを示す。<br>
下表に、ファイル選択ダイアログのプロパティのうち、設定を意識する必要がある主なプロパティを示す。<br>
228行目: 340行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== Filtersプロパティ (ファイルの種類) の設定 ====
==== Filtersプロパティ (ファイルの種類) の設定 ====
ダイアログで開くことができるファイルの種類は、<code>Filters</code>プロパティにフィルタ文字列を設定する。<br>
ダイアログで開くことができるファイルの種類は、<code>Filters</code>プロパティにフィルタ文字列を設定する。<br>
297行目: 408行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== 使用例 ====
==== 使用例 ====
以下の例では、Avalonia UIを使用してファイル保存ダイアログを実装している。<br>
以下の例では、Avalonia UIを使用してファイル保存ダイアログを実装している。<br>
310行目: 420行目:
  using System.Threading.Tasks;
  using System.Threading.Tasks;
   
   
  namespace AvaloniaFileSaveDialog
  public partial class MainWindow : Window
  {
  {
     public partial class MainWindow : Window
     public MainWindow()
     {
     {
       public MainWindow()
       InitializeComponent();
    }
    private void InitializeComponent()
    {
      AvaloniaXamlLoader.Load(this);
    }
    // 保存ボタンを押下
    public async void OnSaveButtonClicked(object sender, RoutedEventArgs e)
    {
      try
       {
       {
           InitializeComponent();
           string content = "Hello, directory.";  // 保存する内容
          string savedFilePath = await ShowSaveFileDialogAsync();
          if (!string.IsNullOrEmpty(savedFilePath))
          {
            await SaveFileAsync(savedFilePath, content);
            Console.WriteLine("成功", $"ファイルを正常に保存: {savedFilePath}");
          }
       }
       }
       catch (Exception ex)
       private void InitializeComponent()
       {
       {
           AvaloniaXamlLoader.Load(this);
           Console.WriteLine("エラー", $"ファイルの保存中にエラーが発生: {ex.Message}");
       }
       }
    }
   
   
       // 保存ボタンを押下
    // ファイル保存ダイアログを表示して、選択されたファイルパスを返す
       public async void OnSaveButtonClicked(object sender, RoutedEventArgs e)
    private async Task<string> ShowSaveFileDialogAsync()
    {
      var saveFileDialog = new SaveFileDialog();
      // ダイアログのタイトル
      saveFileDialog.Title = "ファイルを保存";
      // .txtファイルのフィルタを追加
      saveFileDialog.Filters.Add(new FileDialogFilter { Name = "テキストファイル", Extensions = { "txt" } });
      string result = await saveFileDialog.ShowAsync(this);
       return result;
    }
    // 指定されたパスにファイルを非同期で保存
    private async Task SaveFileAsync(string filePath, string content)
    {
       await File.WriteAllTextAsync(filePath, content);
    }
}
</syntaxhighlight>
<br><br>
 
== ディレクトリ選択タイアログ ==
==== OpenFolderDialogクラスのプロパティ ====
下表に、ディレクトリ選択ダイアログのプロパティのうち、設定を意識する必要がある主なプロパティを示す。<br>
<br>
<center>表. OpenFolderDialogクラスの主なプロパティ<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | プロパティ名
! style="background-color:#00ffff;" | データ型
! style="background-color:#00ffff;" | 意味
|-
| AllowMultiple || bool || 複数のアイテムの選択を許可するかどうかを指定する。<br>複数のアイテムを選択する場合 : true<br>単一のファイルのみの場合 : false (既定値 : false)
|-
| Directory || string || ダイアログが最初に開くディレクトリのパスを指定する。<br>ユーザが頻繁にアクセスするディレクトリやアプリケーションのデフォルトディレクトリを初期表示するために使用する。<br><br>例: "ドキュメント"ディレクトリを初期ディレクトリとして指定する場合<br><code>Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)</code>
|-
| SuggestedStartLocation || IStorageFolder型 || ダイアログの推奨される開始位置を指定する。<br><code>Directory</code>プロパティの代替として使用できる。<br>特定のストレージプロバイダ (例: OneDriveディレクトリ) を初期位置として指定する場合に特に有効である。<br><br><u>※注意</u><br><u>この値が設定されている場合、Directoryプロパティよりも優先される。</u>
|-
| Title || string || ディレクトリ選択ダイアログのウインドウタイトルを指定する。
|}
</center>
<br>
 
==== 使用例 ====
以下の例では、Avalonia UIを使用してディレクトリ選択ダイアログを使用している。<br>
<br>
ダイアログはユーザのデスクトップディレクトリから開始されるが、何らかの理由でデスクトップディレクトリにアクセスできない場合は、ドキュメントディレクトリにフォールバックする。<br>
<br>
この方法は、ユーザが頻繁に使用するディレクトリからダイアログを開始することにより、ユーザエクスペリエンスを向上させることができる。<br>
また、<code>SuggestedStartLocation</code>プロパティを使用することで、将来的により柔軟な開始位置の設定 (例: アプリケーション固有のストレージフォルダ等) が可能になる。<br>
<br>
<syntaxhighlight lang="c#">
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using System;
using System.Threading.Tasks;
public partial class MainWindow : Window
{
    public MainWindow()
    {
      InitializeComponent();
    }
    // ディレクトリ選択ボタンのクリックイベントハンドラ
    private async void OnSelectDirectoryClicked(object sender, RoutedEventArgs e)
    {
      try
       {
       {
           try
           // OpenFolderDialogのインスタンスを生成
          var dialog = new OpenFolderDialog
           {
           {
             string content = "これはファイルの内容です";  // 保存する内容
             // ダイアログのタイトルを設定
             string savedFilePath = await ShowSaveFileDialogAsync();
             Title = "ディレクトリを選択してください",
   
   
             if (!string.IsNullOrEmpty(savedFilePath))
             // 初期ディレクトリを設定
             {
            Directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
                await SaveFileAsync(savedFilePath, content);
          };
                Console.WriteLine("成功", $"ファイルを正常に保存: {savedFilePath}");
            }
          // SuggestedStartLocationを設定
          // デスクトップディレクトリを推奨開始位置として使用
          var desktopFolder = await StorageProvider.TryGetFolderFromPathAsync(
                                      Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
          if (desktopFolder != null)
          {
             dialog.SuggestedStartLocation = desktopFolder;
          }
          else
          { // デスクトップフォルダが取得できない場合は、従来のDirectoryプロパティを使用
            dialog.Directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
          }
          // ダイアログを表示して、ディレクトリを選択するまで待機
          string? result = await dialog.ShowAsync(this);
          // 結果の処理
          if (result != null)
          {  // 選択されたディレクトリパスを表示
            Console.WriteLine($"{result}");
           }
           }
           catch (Exception ex)
           else
           {
           { // ユーザがキャンセルした場合やディレクトリが選択されなかった場合
             Console.WriteLine("エラー", $"ファイルの保存中にエラーが発生: {ex.Message}");
             Console.WriteLine("ディレクトリが未選択");
           }
           }
       }
       }
      catch (Exception ex)
      {  // 予期せぬエラーが発生した場合
          Console.WriteLine($"エラーが発生: {ex.Message}");
      }
    }
}
</syntaxhighlight>
<br><br>
== ディレクトリ選択タイアログ (StorageProviderクラス) ==
==== StorageProviderクラスのプロパティ ====
下表に、ディレクトリ選択ダイアログのプロパティのうち、設定を意識する必要がある主なプロパティを示す。<br>
<br>
<center>表. StorageProviderクラスの主なプロパティ<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | プロパティ名
! style="background-color:#00ffff;" | データ型
! style="background-color:#00ffff;" | 意味
|-
| AllowMultiple || bool || 複数のアイテムの選択を許可するかどうかを指定する。<br>複数のアイテムを選択する場合 : true<br>単一のファイルのみの場合 : false (既定値 : false)
|-
| FileTypeFilter || IReadOnlyList<FilePickerFileType>型 || <code>FilePickerOpenOptions</code>等のオプションクラスのプロパティとして使用する。<br>選択可能なファイルタイプを制限するためのフィルタのリストを指定する。
|-
| SuggestedStartLocation || IStorageFolder型 || ファイルピッカーやフォルダピッカーが開く初期ディレクトリを指定する。<br><code>FilePickerOpenOptions</code>や<code>FolderPickerOpenOptions</code>等のオプションクラスのプロパティとして使用する。<br><br>未指定または<code>null</code>を指定した場合、ファイルピッカーやフォルダピッカーは、システムやアプリケーションのデフォルトの開始位置を使用する。<br>多くの場合、ユーザのドキュメントディレクトリ、または、最後にファイルピッカーを使用した場所になる。
|-
| Title || string || ファイル選択ダイアログのウインドウタイトルを指定する。
|}
</center>
<br>
==== 使用例 ====
以下の例では、指定された開始位置 ("/usr/local/bin") からディレクトリ選択ダイアログを開き、ユーザが選択したディレクトリのパスを取得している。<br>
<br>
<syntaxhighlight lang="c#">
using Avalonia.Platform.Storage;
using System.IO;
using System.Threading.Tasks;
   
   
       // ファイル保存ダイアログを表示して、選択されたファイルパスを返す
public class MyClass
       private async Task<string> ShowSaveFileDialogAsync()
{
    public async Task OpenDirectoryAsync()
    {
       var storageProvider = TopLevel.GetTopLevel(this)?.StorageProvider;
       if (storageProvider != null)
       {
       {
           var saveFileDialog = new SaveFileDialog();
           var options = new FolderPickerOpenOptions
          {
            SuggestedStartLocation = await storageProvider.TryGetFolderFromPathAsync("/usr/local/bin"),
            AllowMultiple = false
          };
          var folders = await storageProvider.OpenFolderPickerAsync(options);
          if (folders.Count > 0)
          {
            var selectedFolder = folders[0];
            // 選択されたディレクトリに対する処理
            // 例: ディレクトリのパスを取得
            var path = await selectedFolder.GetPathAsync();
            System.Diagnostics.Debug.WriteLine($"選択ディレクトリ: {path}");
          }
      }
    }
}
</syntaxhighlight>
<br>
==== ディレクトリパスのURLデコード ====
Avalonia UIのストレージシステムは、内部でパスの処理を適切に行うように設計されている。<br>
そのため、IStorageFolder.GetPathAsyncメソッドは、デコードされたパスを返す。<br>
<br>
しかし、もしパスに特殊文字が含まれている場合や何らかの理由でURLエンコードされた形式で返される可能性がある場合は、以下に示すようにURLデコードを行うことができる。<br>
<br>
<syntaxhighlight lang="c#">
// 方法 1
   
   
          // ダイアログのタイトル
using System.Web;
          saveFileDialog.Title = "ファイルを保存";
   
   
          // .txtファイルのフィルタを追加
var path = await selectedFolder.GetPathAsync();
          saveFileDialog.Filters.Add(new FileDialogFilter { Name = "テキストファイル", Extensions = { "txt" } });
var decodedPath = HttpUtility.UrlDecode(path);
System.Diagnostics.Debug.WriteLine($"選択ディレクトリ: {decodedPath}");
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
// 方法 2
   
   
          string result = await saveFileDialog.ShowAsync(this);
using System.Net;
          return result;
using System.Linq;
      }
   
   
      // 指定されたパスにファイルを非同期で保存
// ディレクトリが空でないことを確認
      private async Task SaveFileAsync(string filePath, string content)
if (folders.Any())
      {
{
          await File.WriteAllTextAsync(filePath, content);
    var selectedFolder = folders.First();
      }
    var path = await selectedFolder.GetPathAsync();  // パスを取得
     }
    var decodedPath = WebUtility.UrlDecode(path);    // パスをデコード
    System.Diagnostics.Debug.WriteLine($"選択ディレクトリ: {decodedPath}");
}
else
{
     System.Diagnostics.Debug.WriteLine("ディレクトリが未選択");
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>


{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]