プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

Insider Preview にしたらコルタナさんが遠い存在になった件

f:id:puni-o:20160512102305p:plain

昨日のブログの最後の現象


f:id:puni-o:20160511184849p:plain

コルタナさんを使うアプリでVoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsyncFileNotFoundExceptionを吐くようになりました。(上記StorageFileからファイルの読み込みはできます)


を調べていたところ同じような現象に陥っている人がいました。

[UWP] Loading Voice Command Definition file appears broken

どうやら皆さんInsider Preview上で起きているようなので、多分IPが原因なんでしょう

解決策は書いていないし見つけられなかったのでOSの更新待ちなんですかねぇ・・・

Windows 10 のストレージの設定を変更したらUWPの開発で詰んだ話

f:id:puni-o:20160511180449j:plain

現時点でも解決していないんですけど、これ以上進展しなさそうなので書きます。

現象が起きた環境

原因(と思われるもの)

f:id:puni-o:20160511182256p:plain

Windows 10 のシステム→ストレージの新しいアプリの保存先をデフォルト以外(今回はFドライブ)に変更しました

結果

f:id:puni-o:20160511182518p:plain

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の開発ができない(デバッグ実行できないと無理ぽ)ので背に腹は代えられません。

相変わらずの長い更新処理を終えて無事(?)デバッグ実行ができるようになりましたが・・・

f:id:puni-o:20160511184316p:plain

Packagesフォルダ下のいくつかのフォルダがJUNCTIONになってる!

参照先はf:\WpSystem\・・・\Local\Packages\アプリIDと、元に戻したはずなのにFドライブを見続けているみたい・・・。 開発中のアプリをアンインストールして対象フォルダを消して、もう一度デバッグ実行しても同じでした。

もう一つよくわからない現象が・・・

f:id:puni-o:20160511184849p:plain

コルタナさんを使うアプリでVoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsyncFileNotFoundExceptionを吐くようになりました。(上記StorageFileからファイルの読み込みはできます)

こっちの原因が何なのかわからないのですが、デバッグ実行できなくなってデバッグ実行できるようになったら例外が出るようになったのでやっぱりこれもストレージ設定の変更が原因なんですかねぇ・・・

結論

システムの設定は変えない方がいい

おまけ

14295にしたらサブディスプレイのタスクバー(自動的に隠す)がちゃんと自動で隠れるようになりました

UWPで動的にスタイルを変更する

f:id:puni-o:20160425183123j:plain

UWPのXAMLではDynamicResourceが指定できないので無理ですね。(DynamicResourceないよね・・?) おしまい。

それっぽくがんばる

ということでそれっぽく頑張ります。

まずは準備 f:id:puni-o:20160425183453p:plain

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で新しいリソースディクショナリ作って画面遷移(して戻ってきている)で終了。

リソースディクショナリを変更してコントロールを作り直しているってことですね。 実行イメージはこんな感じ

f:id:puni-o:20160425184603g:plain

Borderの背景色が変わっていることとListBoxの選択状態が解除されている(初期状態に戻っている)事がわかりますね。

という方法を

Jerry Nixon on Windows: Walkthrough: Dynamically Skinning your Windows 8 App

ここで見つけたんですがこれでいいんですかね~~~、よくわかりません。 おしまい