Windows 8およびWinRT(メトロ)アプリケーションの一部の機能について

新しいWindows 8オペレーティングシステムと新しい[スタート]メニュー用に設計された新しいタイプのアプリケーションについて説明しています。



以下に書かれているすべてのものにもかかわらず、私はすぐに注意したい-私は技術が好きだったが、Microsoftの伝統的なアプローチ-「すべてをうまくやるが、最も頻繁に使用されるものは悪い」-その栄光で観察されます。



WPFまたはSilverlight向けにプログラミングした場合、インターフェイスのプログラミングに関してWinRT(メトロ)アプリケーションを作成しても、問題は生じません。 さらに、個別の新しいコントロールを使用すると、インターフェースの設計が大幅に簡素化されますが、それに関する有用な本を読むことをお勧めします。

すべての落とし穴は異なります。

まず、プログラムを実行している権限を持つユーザーがアクセスできるコンピューター上のフォルダーおよびファイルへのフルアクセスを安全に忘れることができます。 はい、たとえ管理者であっても。 そしてはい! もう1つの驚きは、メトロアプリケーションのUACも機能しないことです。 ある意味では-これは通常の(古い)アプリケーション専用です。

二番目。 それでもコンピューター上のファイルを操作することは可能ですが、困難がないわけではありません。 特に、アプリケーションは次の場所にアクセスできます。
  1. 図書館:ドキュメント、ビデオ、画像、音楽
  2. ユーザーダウンロードフォルダ
  3. ユーザープロファイルのアプリケーションフォルダー
  4. アプリケーションがインストールされたフォルダー
  5. ユーザーがあなたと共有したフォルダー/ファイル


それでは、ポイントから始めましょう。

1.ライブラリ。


Vistaに戻ってきたが、誰も使っていないこの奇妙なことを覚えていますか? (まあ、少なくとも私は絶対にそれを使用しませんでした-遠くからそれはどういうわけか完全に不快です)

喜ぶ! 今、あなたはそれらを愛するでしょう。

標準アプリケーションの音楽、ビデオ、写真はライブラリでのみ動作します。 もちろん、そこに任意のファイルを開くことができますが、アプリケーション自体からこれを行う場合は不便です。また、エクスプローラーで開く場合、これはエクスプローラーであり、それ自体は便利ではありません。



ただし、すべてがそれほど単純ではない-アプリケーションは、アクセスする必要があるライブラリを明示的に示す必要があります。 さらに、完全かつ無制限のアクセスを受け取り、ファイルやフォルダーの追加/削除/移動、およびファイルの読み取りと書き込みを行うことができます。



注:ユーザー自身が作成したライブラリにアクセスできるかどうかに関する情報はまだ見つかりませんでした(つまり、上記のいずれでもありません)。 現時点では、すべてはユーザーの参加なしではそのようなアクセスを取得できないように見えます。

「ドキュメント」ライブラリは別のものであり、アクセスできないだけです。まず、アプリケーションで使用するファイルの種類(拡張子)を指定する必要があります。



ライブラリフォルダーの場所を確認する必要はありません。KnownFoldersクラスを介してアクセスできます。

2.フォルダ「ダウンロード」ユーザー


まあ、すべてが簡単です-書き込みアクセスのみ。 ユーザーの介入なしにファイルを作成し、そこに何かを書き込むことができます。

3.ユーザープロファイルのアプリケーションフォルダー


ローカルとローミングの2つのフォルダーがあります。 1つは現在のコンピューターにあり、もう1つは、ユーザープロファイルがドメインコントローラーなどに集中的に保存されている場合に移動します。 一般に、すべては以前と同じです(フォルダーC:\ Users \ "user" \ AppData \ Local and Roamingのサブフォルダーを参照)、ご使用のアプリケーションのみがこれらのフォルダーにアクセスできます。

4.アプリケーションがインストールされたフォルダー


アプリケーションは、任意のファイル/フォルダーへのフルアクセスを持ち、それらを使用して必要なことを何でも行うことができます。

5.ユーザーがあなたにアクセスを許可したフォルダー/ファイル


そして今、実際には、最も興味深い。

上記の場所にないフォルダ/ファイルにアクセスする唯一の方法は、 FolderPickerクラスFilePickerクラスを使用することです。

これは次のように行われます。
FolderPicker fp = new FolderPicker(); fp.ViewMode = PickerViewMode.Thumbnail; fp.FileTypeFilter.Add(".jpg"); StorageFolder folder = await fp.PickSingleFolderAsync(); if (folder == null) return; var files = await folder.GetFilesAsync(); foreach(var file in files) …; 


その後、ユーザーにはそのようなウィンドウが表示されます。



そして、選択したユーザーへのフルアクセスを取得します。

ところで、 async / awaitに気づきましたか?
それに慣れる-同期関数はもうありません。 まあ、少なくとも最も頻繁に必要なもの。 たとえば、以前の形式の1行のファイルからデータを読み取ることができた場合:
 string[] lines = File.ReadAllLines("filename.txt"); 

これで、次のようになります。
 IList<string> lines = await ReadFileAsync("filename.txt"); 


ちなみに、驚き-MessageBoxはもうありません:)これで再び次のようになります。
 await ShowMessage(“”); 


そして、ここで別の問題に遭遇します。awaitは、非同期とマークされた関数でのみ使用できます。 当然、すべての機能をこのようにマークできるわけではありません。
この場合、必要なすべてのコードを別の関数に入れて、適切な場所に配置して、完了するのを待つと役立ちます。
 public async Task<object> MyAsyncFunction() { return await …; } public MySyncFunction() { var res=MyAsyncFunction(); res.Wait(); if(res.Result==...) ...; } 


ただし、このようなコードは時々ハングしますが、クラッシュしません。 したがって、それをデバッグすることは喜びです。

おわりに

上で書いたように、一般に、この技術は興味深いものです。しかし、アプリケーションがディスク上のファイルを積極的に使用したい場合や、ユーザーからの秘密でさえも、これはあなたの選択ではありません。 しかし、インターネットから子猫をダウンロードして描画するアプリケーションを作成するには、文字通りキーボードに触れることなくできます

Source: https://habr.com/ru/post/J151619/


All Articles