Управление только WPF в режиме отладки

У меня есть несколько полезных кнопок wpf для тестирования некоторых функций. Было бы неплохо не показывать их в выпуске, но в отладочном режиме.

Выполнение этого кода легко. Но я бы предпочел декларативное решение.

Ответ 1

Единственное, что я знаю, это создать статическое свойство где-то вроде этого:

    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 не имеет ничего для флагов компилятора.

Ответ 2

Это будет отображаться при подключении отладчика. Сначала задайте пространство имен:

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}}" />

Ответ 3

Насколько я знаю, нет способа использовать константы конфигурации (Debug, Release) из XAML.
Таким образом, лучшее, что вы можете получить, - привязать свойство Видимости кнопок к свойству Debug в вашем datacontext. Но для установки этого свойства по-прежнему потребуется некоторый код.

Ответ 4

Основываясь на ответе Стивена... Вы можете использовать статический класс и объявлять видимость только один раз.

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>

Ответ 5

Не уверен, какая разница между этим и Стивеном, но я использовал его свойство как нестатическое свойство в нестационарном классе и ссылался на него так:

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