かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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