ちょっと仕事の関係でSilverlgith3をつっついてたら、ちょっと直感的じゃないなっていう動きと、これバグ・・・?と思う動きをするのを見つけたのでメモメモ。
FrameのNavigatedイベント
Silverlight3で追加されたナビゲーションフレームワークのFrameコントロールに画面遷移後(ヘルプの記述をかりると"移動先のコンテンツが見つかり、使用可能である場合に発生します。")に発生するNavigatedイベントがあります。
ここで、ごにょごにょ処理をやっていたら、思わぬタイミングで動くことがありました。
画面構成としてはTabControlのTabItem上にFrameを置いた感じです。このとき、Frameには、何かしらのControlが表示されている必要があります。Tabが切り替わってFrameのあるTabItemが表示されるとNavigatedイベントが発生してしまいます。
以下の手順でプロジェクト作るだけで、再現すると思います。
Silverlightアプリケーションを作成して、SilverlightControl1という名前でユーザコントロールを作成します。
MainPage.xamlのコンテンツを以下のようにする。
<Grid x:Name="LayoutRoot"> <controls:TabControl> <controls:TabItem Header="Frame"> <!-- 適当に作ったユーザコントロールをとりあえず表示させる --> <navigation:Frame Navigated="Frame_Navigated" Source="/SilverlightControl1.xaml"> </navigation:Frame> </controls:TabItem> <controls:TabItem Header="Dummy" /> </controls:TabControl> </Grid>
コードビハインドでは、Navigatedイベントでデバッグウィンドウにログを出すようにします。
using System.Diagnostics; using System.Windows.Controls; namespace NaviAndMsg { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Frame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) { Debug.WriteLine("Navigated: " + e.Content + ", " + e.Uri); } } }
実行すると、画面が表示されるタイミングでNavigatedイベントに書いたログが出力されます。
Navigated: NaviAndMsg.SilverlightControl1, /SilverlightControl1.xaml
これは想定通り(初回の画面遷移)なんですが、Tabを切り替えてFrameを表示させるたびに以下のようなログが出てしまいます。
Navigated: , /SilverlightControl1.xaml Navigated: , /SilverlightControl1.xaml Navigated: , /SilverlightControl1.xaml
ちょっと微妙だけど仕様なのかな・・・・?
MessageBoxを表示するとIMEが効かなくなる
前のは、仕様って言われたらガッカリするだけですが、こっちはバグじゃないのかな〜と思っています。
再現は簡単。適当なSilverlightアプリケーションを作ってTextBoxとButtonを置いて、ButtonのClickイベントでMessageBox.Show("Hello world");を呼びます。
MessageBoxのOKを、押した後TextBoxでIMEが効かなくなります。
因みにブラウザの、検索バーとかでIMEを一旦有効にしたりするとなおります。
試したXAMLとコードは以下の通りです。
<UserControl xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" x:Class="NaviAndMsg.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> <StackPanel x:Name="LayoutRoot"> <TextBox Width="150" /> <Button Content="Click" Width="150" Click="Button_Click" /> </StackPanel> </UserControl>
using System.Windows; using System.Windows.Controls; namespace NaviAndMsg { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { MessageBox.Show("Hello world"); } } }
出来れば再現するか、確認できるかたはしていただいてコメント頂けると嬉しいですm(_ _)m