うまくいくものを見つけました。アイデアは、コードを実行しているプロセス名のチェックとDesignerProperties.GetIsInDesignMode(...)
組み合わせたアプローチを使用することです。
VisualStudio 2010の場合、プロセス名は「devenv」であることがわかります。

次に、プロセス情報を取得するために必要なものであることを説明するこの投稿を見つけました。System.Diagnostics.Process
それを知って、私はこのヘルパーメソッドを作成しました:
private bool IsVisualStudio2010DesignerRunning()
{
using (var process = System.Diagnostics.Process.GetCurrentProcess())
{
const string visualStudio2010ProcessName = "devenv";
if (process.ProcessName.ToLowerInvariant().Contains(visualStudio2010ProcessName)
&& DesignerProperties.GetIsInDesignMode(this))
{
return true;
}
else
return false;
}
}
これが機能していることを説明するために、ここにそのアプリケーションの例を示します
それは私が書いたSunkenBorderと呼ばれるカスタムコントロールにあります。このコントロールには、最初の機会に特定のVisualStateに遷移する動作があるため、この状態はユーザーに表示される初期状態です。このコードはOnApplyTemplate()
オーバーライドで実行されます。Expression Blend 4は、実行時にこれを処理および表示できます。一方、Visual Studio 2010のデザイナは、Storyboard
への呼び出しによって開始されたを実行できないため、完全にクラッシュしVisualStateManager.GoToState(...)
ます。
これが機能していることをわかりやすく説明するためにOnApplyTemplate()
、VS 2010デザイナーを対象とするコードでコントロールのbackgroundプロパティを青に設定しています(スクリーンショットを参照)。
/// Non-static constructor
public SunkenBorder()
{
// Avoid Visual Studio 2010 designer errors
if (IsVisualStudio2010DesignerRunning())
return;
// Expression Blend 4's designer displays previews of animations
// that these event handlers initiate!
Initialized += new EventHandler(SunkenBorder_Initialized);
Loaded += new RoutedEventHandler(SunkenBorder_Loaded);
Unloaded += new RoutedEventHandler(SunkenBorder_Unloaded);
IsVisibleChanged += new DependencyPropertyChangedEventHandler(SunkenBorder_IsVisibleChanged);
}
// ...
/// Used to set the initial VSM state (its the first opportunity).
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (IsVisualStudio2010DesignerRunning())
{
// set a property just to illustrate that this targets only Visual Studio 2010:
this.Background = Brushes.Blue;
// return before doing VisualState change so Visual Studio's designer won't crash
return;
}
// Blend 4 executes this at design-time just fine
VisualStateManager.GoToState(this, "InitialState", false);
// ...
}
これがExpressionBlend4のプレビューの外観です(SunkenBorderコントロールの背景が青ではないことに注意してください)...

...そしてこれがVisualStudioのデザイナーが見せてくれたものです。これで、デザイナーがクラッシュすることはなく、SunkenBorderコントロールの背景はすべて青色になります...

...そして最後に、実行時の結果を次に示します(ここでも、SunkenBorderコントロールの背景は青ではありません)。
