2012-01-25 56 views
6

這個問題很久就讓我感到困擾: 如果Visual Studio設計器正在執行它,那麼我可以擁有一個條件嗎?否則返回false?Visual Studio:條件「if(InDesigner)」

例如(WPF),我想使用一個特殊BoolToVisibilityConverter一些控件的可見性屬性綁定到鼠標被過度對照。我使用以下XAML代碼執行此操作:

<Image Width="50" Height="50" Source="../Images/MB_0010_tasks.ico" Margin="12,133,133,12" MouseLeftButtonUp="Image_MouseLeftButtonUp" 
      Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=IsMouseOver, Converter={StaticResource __boolToVisibilityConverter}}" /> 

這會導致元素在Visual Studio的設計器視圖中不可見。有沒有辦法告訴轉換器是這樣的:

#if DESIGNER 
return Visibility.Visible; 
#endif 
return b ? Visibility.Visible : Visibility.Hidden; 

回答

9

可以使用System.ComponentModel.DesignerProperties.GetIsInDesignMode()方法:

// In WPF: 
var isDesign = DesignerProperties.GetIsInDesignMode(Application.Current.MainWindow); 

// In Silverlight: 
var isDesign = DesignerProperties.GetIsInDesignMode(Application.Current.RootVisual); 

if(isDesign) 
{ 
    // designer code 
    return; 
} 

// non designer code 

無論是Blend還是Visual Studio(我不確定它是哪一個),這將始終是錯誤的,所以您還應該包含以下檢查:

isDesign = isDesign || Application.Current.GetType().Equals(typeof(Application)); 

這工作,因爲在正在運行的程序Application.Current將永遠是你自己的派生應用程序類(默認爲:App,在App.xaml中和App.xaml.cs分別定義)

+0

工程就像一個魅力,尤其是在我的BoolToVisibilityConverters中。非常感謝! – Akku

+0

+1!最後,有效的東西! GetIsInDesignMode開始返回false,但是您的最後一張支票取得了訣竅,謝謝! –

3

對於WPF應用程序,你可以嘗試像以下:

 if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
     { 
      // If we're here it's the design mode 
     }