Insider Preview にしたらコルタナさんが遠い存在になった件
昨日のブログの最後の現象
コルタナさんを使うアプリでVoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync
がFileNotFoundException
を吐くようになりました。(上記StorageFileからファイルの読み込みはできます)
を調べていたところ同じような現象に陥っている人がいました。
[UWP] Loading Voice Command Definition file appears broken
どうやら皆さんInsider Preview上で起きているようなので、多分IPが原因なんでしょう
解決策は書いていないし見つけられなかったのでOSの更新待ちなんですかねぇ・・・
Windows 10 のストレージの設定を変更したらUWPの開発で詰んだ話
現時点でも解決していないんですけど、これ以上進展しなさそうなので書きます。
現象が起きた環境
- Windows 10 64bit 1511
- Visual Studio 2015 Update2
原因(と思われるもの)
Windows 10 のシステム→ストレージの新しいアプリの保存先
をデフォルト以外(今回はFドライブ)に変更しました
結果
Visual Studio 2015でUWPのデバッグ実行ができなくなりました
A debugger is attached to アプリ名 but not configured to debug this unhandled exeption.To debug this exeption, detach the current debugger.
ってダイアログが原因じゃなくてその裏のJust-In-Time Debuggerダイアログで止まっている方が原因だと思いますが、有益な情報はありません。(多分)
原因だと思われる新しいアプリの保存先
を元に戻しましたが変化ありませんでした。
普通にストアから落としたアプリは実行できるのでWindowsではなくVisual Studioの問題だと予想してVisual Studioの修復インストールもしてみましたが効果ありませんでした。
原因と解決方法(多分)
UWP projects couldn't be run after changing storage folder in Settings | Microsoft Connect
フィードバックが上がっていました。これであたりだと思います。 状態がアクティブなので今後何らかの解決策が出る可能性はありそうですが、コメントには
We have identified it as a bug in the Windows 10 operating system and a fix is now available in the Windows 10 Insider Preview Build 14295 which was released at the //BUILD conference. Upgrading your system to that OS would resolve the problem.
14295で治ったからOSあげろ
ってことでいいんでしょうか・・・。
Insider Preview へアップデート
14295はSlow Ringに来ているのでそれほどひどいバグはなさそうですし、何よりUWPの開発ができない(デバッグ実行できないと無理ぽ)ので背に腹は代えられません。
相変わらずの長い更新処理を終えて無事(?)デバッグ実行ができるようになりましたが・・・
Packagesフォルダ下のいくつかのフォルダがJUNCTION
になってる!
参照先はf:\WpSystem\・・・\Local\Packages\アプリID
と、元に戻したはずなのにFドライブを見続けているみたい・・・。
開発中のアプリをアンインストールして対象フォルダを消して、もう一度デバッグ実行しても同じでした。
もう一つよくわからない現象が・・・
コルタナさんを使うアプリでVoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync
がFileNotFoundException
を吐くようになりました。(上記StorageFileからファイルの読み込みはできます)
こっちの原因が何なのかわからないのですが、デバッグ実行できなくなってデバッグ実行できるようになったら例外が出るようになったのでやっぱりこれもストレージ設定の変更が原因なんですかねぇ・・・
結論
システムの設定は変えない方がいい
おまけ
14295にしたらサブディスプレイのタスクバー(自動的に隠す)がちゃんと自動で隠れるようになりました
UWPで動的にスタイルを変更する
UWPのXAMLではDynamicResourceが指定できないので無理ですね。(DynamicResourceないよね・・?) おしまい。
それっぽくがんばる
ということでそれっぽく頑張ります。
まずは準備
App.xaml
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Styles/StandardStyle.xaml" /> <ResourceDictionary Source="Styles/BlueTheme.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
BlueTheme.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Name="MyBrush" Color="Blue"/> </ResourceDictionary>
こんな感じ。
StandardStyle.xaml
には共通のスタイルが入っているつもりです。(今回は空)
Blue(Green/Red)Theme.xaml
にはそれぞれのテーマが定義してあります。(RedとGreenにはそれぞれの色が定義されています)
MainPage.xaml
<Page> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Orientation="Horizontal"> <Button Content="Blue" Click="Button_Click"/> <Button Content="Green" Click="Button_Click"/> <Button Content="Red" Click="Button_Click"/> </StackPanel> <Border Grid.Row="1" Background="{StaticResource MyBrush}"/> <ListBox Grid.Row="1" Grid.Column="1"> <ListBoxItem>1</ListBoxItem> <ListBoxItem>2</ListBoxItem> <ListBoxItem>3</ListBoxItem> <ListBoxItem>4</ListBoxItem> </ListBox> </Grid> </Page>
Button_Clickイベントでテーマ(Blue/Green/Red)を切り替えます。リストボックスはなんとなく置いてあります。
切り替える部分はこんな感じ。
private void Button_Click(object sender, RoutedEventArgs e) { var themeUri = new Uri($"ms-appx:/Styles/{(sender as Button).Content}Theme.xaml"); ChangeTheme(themeUri); } private void ChangeTheme(Uri theme) { var starndard = new ResourceDictionary { Source = new Uri("ms-appx:/Styles/StandardStyle.xaml") }; var custom = new ResourceDictionary { Source = theme }; var main = new ResourceDictionary(); main.MergedDictionaries.Add(starndard); main.MergedDictionaries.Add(custom); App.Current.Resources = main; var frame = Window.Current.Content as Frame; frame.Navigate(frame.Content.GetType()); frame.GoBack(); }
Button_Click
イベントでリソースへのUriを作ってChangeTheme
を呼びます。
ChangeTheme
で新しいリソースディクショナリ作って画面遷移(して戻ってきている)で終了。
リソースディクショナリを変更してコントロールを作り直しているってことですね。 実行イメージはこんな感じ
Borderの背景色が変わっていることとListBoxの選択状態が解除されている(初期状態に戻っている)事がわかりますね。
という方法を
Jerry Nixon on Windows: Walkthrough: Dynamically Skinning your Windows 8 App
ここで見つけたんですがこれでいいんですかね~~~、よくわかりません。 おしまい