silverlight4においてはTextBoxのWatermarkはサポートされていない。
MSDNを参照すると、Watermarkプロパティ自体は存在するのだが、「Silverlight 4 アプリケーションでは使用しないでください。」と記載があるため使えない。
じゃあプロパティ追加するなよ!などと言っていても仕方がないので、実現方法を考えなければならない。
いや、実現方法は考えなくていい。なぜなら、この程度のことは既に優秀な開発者の方々が解決してくれているからだ。
ただし、様々な方法があり、メリット・デメリットがあるため、解決方法を吟味して選ばなければならない。

探した結果、実現方法を3つ見つけた。以下はそれぞれのURLと感想。
おそらく実現方法1が最良。

実現方法1: VisualStateManager

http://timheuer.com/blog/archive/2008/10/22/silverlight-watermark-text-box-control.aspx

・問題なく使えた。おすすめ。他の実現方法は面倒だったりデメリットが多い

実現方法2: コードビハインドとImageBrush

http://code.msdn.microsoft.com/XAMLVBC-Watermark-b1436bc7/

・画像を用意するのが面倒
・使う度にコードビハインドを書かなければならない

実現方法3: ビヘイビア

http://weblogs.asp.net/jdanforth/archive/2010/09/17/silverlight-watermark-textbox-behavior.aspx

・Textプロパティにバインディングを使っていると初期表示がうまくいかない
・TextプロパティにWatermarkの内容が入るため、Textプロパティを参照するとWatermarkの内容を取得してしまう
・Expression BlendのSDKを入れなければならない

Enum値をラジオボタンで選択したい場合に非常に便利なコンバータを発見した。
StackOverflowに載っていたコードなのだが、Answerのコメントで
更に修正され、Silverlightでもうまく動くようなっている。

これが、コンバータのコード。

public class EnumBooleanConverter : IValueConverter
{
  #region IValueConverter Members
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null)
      return DependencyProperty.UnsetValue;

    if (Enum.IsDefined(value.GetType(), value) == false)
      return DependencyProperty.UnsetValue;

    object parameterValue = Enum.Parse(value.GetType(), parameterString);

    return parameterValue.Equals(value);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null || value.Equals(false) )
        return DependencyProperty.UnsetValue;

    return Enum.Parse(targetType, parameterString);
  }
  #endregion
}

下記のようなEnumがあったとする。

public enum HogeKind
{
  All,
  One
}

これをラジオボタンで選択する場合、さきほどのコンバータを使って下記のようにXamlコードを書くことで実現できる。
(DataContextにHogeKind型のOwnValueプロパティがある前提)

  <RadioButton Content="すべて" IsChecked="{Binding Path=OwnValue, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter }, ConverterParameter=All}" />
  <RadioButton Content="ひとつ" IsChecked="{Binding Path=OwnValue, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter }, ConverterParameter=One}" />

Xamlをダウンロードして動的に読み込めるらしい。ということはもちろんテキストボックスにXAML書いて、それを表示ということもできるだろうと思ってやったら、やっぱり(当然)できた。
ちょっとしたXAMLコードを書いて表示を確認する場合は、VisualStudioを使うよりも、Silverlight上でXamlを編集・表示できる方がいいだろう。
というわけで作ってみたかなりショボいツールがこれ

http://devneko.net/csharp/genxaml/

下記のようなコードで実現している。

  var xaml = String.Format("{0}", XamlText.Text);
  try
  {
      XamlContent.Content = (UIElement)System.Windows.Markup.XamlReader.Load(xaml);
  }
  catch (Exception e)
  {
      MessageBox.Show(e.Message);
  }

silverlightでMessageBox.Show()を使ってメッセージボックスを表示すると、IMEが無効になる場合がある。
これはIMEの詳細なテキストサービスというのが悪さをしているからのようで、IMEの設定から
詳細なテキストサービスをオフにすれば現象は発生しなくなる。また、WindowsVista以降では発生しない。

この問題はSilverlight自体の問題ではないため、WindowsXP環境でMessageBox.Show()を使うとどうしても発生してしまう。
ちなみにMicrosoftにも報告は上がっているが、対処されることはないと思われる。

http://connect.microsoft.com/VisualStudioJapan/feedback/details/599841/silverlight4-messagebox-show-string-message-ime

おそらく根本原因は下記のものと同じだ。

http://support.microsoft.com/default.aspx?scid=kb;ja;898663

考えつく限り有効な対策はMessageBox.Show()を使うことを諦めることだけだ。
代わりにPopupやDialogを使うのが妥当な選択肢と思われる。

VisualStudio2010を使ってsilverlightアプリケーションのデバッグを行う場合、InternetExplorerではうまくいくのだが
chromeやfirefoxではうまくいかない。
これは、chromeやfirefoxがsilverlightをブラウザ自体のプロセスとは異なるプロセスで実行するためだ。
VisualStudioは無条件で立ち上げたブラウザのプロセスをアタッチするだけなので、Silverlightが動いていない
プロセスにアタッチしてしまう。
一番簡単な対策はInternetExplorerを使うこと。
どうしてもchromeやfirefoxでデバッグしたい場合は、無料版のVisualStudioでなければ
おそらくアタッチ先を変更できるので毎回手動でアタッチすればchromeやfirefoxでもデバッグ実行が可能だ。