У меня есть несколько полезных кнопок 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 не имеет ничего для флагов компилятора.
Это будет отображаться при подключении отладчика. Сначала задайте пространство имен:
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}}" />
Насколько я знаю, нет способа использовать константы конфигурации (Debug, Release) из XAML.
Таким образом, лучшее, что вы можете получить, - привязать свойство Видимости кнопок к свойству Debug в вашем datacontext. Но для установки этого свойства по-прежнему потребуется некоторый код.
Основываясь на ответе Стивена... Вы можете использовать статический класс и объявлять видимость только один раз.
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>
Не уверен, какая разница между этим и Стивеном, но я использовал его свойство как нестатическое свойство в нестационарном классе и ссылался на него так:
<local:MyClass x:Key="MyClass" />
<MyControl Visibility="{Binding IsDebug, Source={StaticResource MyClass}, Mode=OneTime}" />