かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Silverlight3の微妙な動き(1つはバグ?)

ちょっと仕事の関係で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