C#|WPFアプリケーションにてマウスイベントが拾えない問題

まず問題のコード

【XAML】Window1.xaml

<Window x:Class="WpfApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">

        

    </Grid>

</Window>

【C#】Window1.xaml.cs

using System.Windows;

using System.Windows.Input;

namespace WpfApplication1 {

    /// <summary>

    /// Window1.xaml の相互作用ロジック

    /// </summary>

    public partial class Window1 :Window {

        public Window1() {

            InitializeComponent();

        }

        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

            MessageBox.Show("Clicked!");

        }

    }

}

フォームをクリックしても何も起こらない。

しかし、Window1.xamlをこうすると…

【XAML】

<Window x:Class="WpfApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown" Background="White">

        

    </Grid>

</Window>

GridのBackgroundプロパティにWhiteを指定している。

こうすると意図した通りにメッセージボックスが表示される。

また、Window1.xamlではなくWindow1.xaml.csのコンストラクタで

GridのBackgroundにBrushes.Whiteを指定してもメッセージボックスが表示された。

色が無いコントロールはマウスイベントを拾えない!?仕様なのかバグなのか…。

C#|WPFブラウザアプリケーション(XBAP)で製作したWindows用タスクバー時計

JavaScriptで製作したWindows用タスクバー時計なんてページを見付けたので、それなら僕はXBAPでってことでやってみました。いかに.NETが楽かってことを見せ付けてやろうかと(誰にだ?)。

手順は簡単。VSでWPFブラウザアプリケーションのプロジェクトを作ったらPageにLabelを置いてこんな感じでコーディングします。

using System;
using System.Windows.Controls;
namespace clock {
  public partial class Page1 :Page {
    System.Threading.Thread thread;
    public Page1() {
      InitializeComponent();
      thread = new System.Threading.Thread(loop);
      thread.IsBackground = true;
      thread.Start();
    }
    private void loop() {
      while(true) {
        this.Dispatcher.Invoke(new System.Threading.ThreadStart(update), null);
        System.Threading.Thread.Sleep(1000);
      }
    }
    private void update(){
      this.label1.Content = DateTime.Now.ToString("yy/M/d(ddd)H:mm");
    }
  }
}

う~ん、Javascriptの方が簡単だったかも…。

こんな感じでタスクバーに時計が表示されます。

clockss[1]

そのうちSilverlightでもやってみたいですね。Javascriptでいいだろって突っ込みは無しで…。