Visual Studio:条件“if(InDesigner)”

时间:2012-01-25 10:00:36

标签: c# .net visual-studio visual-studio-2010

这个问题很长一段时间让我烦恼: 如果Visual Studio设计器正在执行它,我可以有一个条件,否则为false?

例如(WPF),我想使用一个特殊的BoolToVisibilityConverter将某些控件的visibility属性绑定到该控件上的鼠标。我使用以下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;

2 个答案:

答案 0 :(得分: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将始终是您自己的派生Application类(默认情况下:App,分别在App.xaml和App.xaml.cs中定义)

答案 1 :(得分:3)

对于WPF应用程序,您可以尝试以下内容:

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