仅在调试模式下WPF显示控制

问题描述:

我有一些有用的wpf按钮来测试某些功能。如果不是在发行版中显示它们,而是在调试中,那将是一件好事。仅在调试模式下WPF显示控制

从代码中做它很容易。但我更喜欢声明式解决方案。

我所知道的唯一的解决办法是在某处建立一个静态属性是这样的:

public static Visibility IsDebug 
    { 
#if DEBUG 
     get { return Visibility.Visible; } 
#else 
     get { return Visibility.Collapsed; } 
#endif 
    } 

然后用它在XAML这样的:

<MyControl Visibility="{x:Static local:MyType.IsDebug}" /> 

XAML不具有任何编译标志。

+0

我使用了一个转换器,但这样更有效率 – pjdupreez 2015-02-04 14:50:00

+0

如果绑定到System.Diagnostics.Debugger.IsAttached足以满足您的要求,请参阅下面的2个答案 – DanW 2015-04-02 11:17:53

据我所知,没有办法使用XAML的配置常量(Debug,Release)。
所以最好的办法是将按钮的Visibility属性绑定到datacontext上的Debug属性。但设置该属性仍然需要一些代码。

+0

也许自定义元素或属性?我对WPF很陌生,所以不要认真对待这个“主意”。 – naeron84 2010-03-12 16:21:16

不知道不同的是这和史蒂芬的做法之间有什么,但我用他的财产在非静态类的非静态属性,并引用它像这样:

<local:MyClass x:Key="MyClass" /> 
<MyControl Visibility="{Binding IsDebug, Source={StaticResource MyClass}, Mode=OneTime}" /> 

这将显示当调试器被连接时。 首先,设置命名空间:

xmlns:diag="clr-namespace:System.Diagnostics;assembly=mscorlib" 

然后设置你的资源:

<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/> 

然后使用绑定:

<MenuItem Header="onlyIfDebuggerAttached" Visibility="{Binding Source={x:Static diag:Debugger.IsAttached}, Converter={StaticResource BoolToVisibilityConverter}}" /> 

基于史蒂芬答案...你可以使用静态类并仅声明一次可见性。

using System.Windows; 

namespace HQ.Wpf.Util 
{ 
    /* Usage: 

     xmlns:wpfUtil="clr-namespace:HQ.Wpf.Util;assembly=WpfUtil" 

     <Button Name="CmdTest" Click="CmdTestOnClick" Visibility="{x:Static wpfUtil:DebugVisibility.DebugOnly}">Test</Button> 

    */ 

    public static class DebugVisibility 
    { 
     public static Visibility DebugOnly 
     { 
#if DEBUG 
      get { return Visibility.Visible; } 
#else 
      get { return Visibility.Collapsed; } 
#endif 
     } 

     public static Visibility ReleaseOnly 
     { 
#if DEBUG 
      get { return Visibility.Collapsed; } 
#else 
      get { return Visibility.Visible; } 
#endif 
     } 
    } 
} 

XAML:

<Button Name="CmdTest" Click="CmdTestOnClick" 
    Visibility="{x:Static wpfUtil:DebugVisibility.DebugOnly}">Test 
</Button>