VB.NETでApplicationBarを使うコードを書くと動作しない
-
2011年9月3日 5:34
開発にVB.NETを使っているのですが、ApplicationBarを使うコードを書くと動作しない(イベントを拾うことができない)のですが、他の方はどうですか?
再現方法
プロジェクトを新規作成「WindowsPhoneアプリケーション」
「MainPage.xaml」の下部でコメントアウトされている「ApplicationBar の使用法を示すサンプル コード」を有効にする
ApplicationBarIconButtonにClickイベントを設定する
イベントにコードを書く(例:MessageBox.Show("ApplicationBarMenuItemがクリックされました"))
デバッグ開始してエミュレータ上のApplicationBarIconButtonタップする→イベントが反応しない
ApplicationBarMenuItemでも同様に反応しません
※実機でデバック開始しても同様です
ちなみに同環境でC#でプロジェクトを作成して同じ手順を踏むと正常に動作するようです
別PCに構築してみても状況は変わりません何かアドバイスがあればお願いします。
- 編集済み 竹内電設.comの中の人 2011年9月3日 5:35
すべての返信
-
2011年9月3日 16:09モデレータ
バグっぽい挙動な気がします。
(デザイナなのか、XAML を処理する部分かは内部的な仕組みを十分に認識できていないため、正しい判断ができません)C# のデザイナは XAML で Click 属性にイベントハンドラの名前を書き出します。
これに対して、VB.NET のデザイナは変数名を割り当てて、xaml.vb 側で Handles キーワードを使ってイベントハンドラを割り当てるようです。
ApplicationBarIconButton1 という変数は用意されていますが、実際、これに代入する処理は自動生成されていますが、正しくないようなので、Nothing になります。Nothing のものに Handles でイベントハンドラを割り当てても何も起きないというのが現状です。回避的には、InitializeComponent() の後に ApplicationBarIconButton1 = ApplicationBar.Buttons(0) とでも書くかといったところでしょうか。
あるいは、XAML に直接 Click 属性でイベントハンドラを割り付けてしまうかですね。(C# の XAML を参考に)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2011年9月3日 16:11
- 回答としてマーク 竹内電設.comの中の人 2011年9月7日 17:27
-
2011年9月7日 9:58
アドバイスありがとうございました。
ご指摘いただいたとおりXAML側で Click="ApplicationBarMenuItem1_Click" と記述すると動作しました
これに関連してですがコード側でApplicationBarMenuItemのTextを書き換えようとすると、NullReferenceExceptionが発生するのも同様の問題に起因することでしょうか?
再現方法
XAML側で
<shell:ApplicationBarMenuItem x:Name="testMenuItem" Text="menuText" Click="ApplicationBarIconButton_Click" />
コード側で
Private Sub ApplicationBarMenuItem1_Click(sender As System.Object, e As System.EventArgs)
testMenuItem.Text = "書き換えテスト"
End Subバグなら(これだけではバグかどうかも判断できませんが)どこかに報告しておいた方がいいのでしょうか?
-
2011年9月7日 14:06モデレータ
これに関連してですがコード側でApplicationBarMenuItemのTextを書き換えようとすると、NullReferenceExceptionが発生するのも同様の問題に起因することでしょうか?
先にも書きましたが、x:Name で指定されている名前の変数は用意されますが、それに対して期待するインスタンスが代入されることはありません。(少なくとも現状は Nothing のまま)
なので、その変数に対して何か操作しようとすれば NullReferenceException が発生することになります。その変数を有効に使いたいのであれば、先にも書きましたとおり、InitializeComponent の後にその変数に対して適切なインスタンスを割り当ててください。
WPDT のバグの報告先は… この辺かなぁ…。
http://wpdev.uservoice.com/forums/110705-app-platform
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

