我试图在调试和发布配置中显示WPF控件中的不同视图元素以进行测试。我用这篇文章作为指南: Does XAML have a conditional compiler directive for debug mode? (SO)
为了测试它,我创建了一个VS2013解决方案,其中包含一个名为TestingAlternateContent的WPF应用项目。在我的AssemblyInfo.cs中,我添加了以下代码:
#if DEBUG
[assembly: XmlnsDefinition("debug-mode", "TestingAlternateContent")]
#endif
在我的MainWindow.xaml中,我创建了一个简单的代码示例来测试此行为,如下所示:
<Window x:Class="TestingAlternateContent.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:debug="debug-mode"
mc:Ignorable="mc debug"
Title="MainWindow" Height="350" Width="525">
<Grid>
<mc:AlternateContent>
<mc:Choice Requires="debug">
<TextBlock Text="Debug mode!!" />
</mc:Choice>
<mc:Fallback>
<TextBlock Text="Release mode here!" />
</mc:Fallback>
</mc:AlternateContent>
</Grid>
</Window>
在测试时,我总是看到窗口显示“释放模式!”消息,无论我使用哪种配置(Debug,Relase)。我已经检查过AssemblyInfo #if DEBUG正在正常工作,当我在Debug / Release配置之间进行更改时会相应地进行更改。 我已经使用.NET Framework 3.5 / 4.5版本在VS2008 / VS2013下测试了相同的代码,但没有一个能够运行。 我错过了什么?任何人都知道这里有什么问题,或者可以发布工作代码作为参考?
答案 0 :(得分:8)
问题是在解析XAML之后解析XmlnsDefinitionAttribute
,因此它对同一个程序集不起作用。
但是,您可以在解决方案中的任何其他(引用的)项目中生成XmlnsDefinition
,并且它可以正常工作
那是:
TestingAlternateContent
)
MainWindow.Xaml
项目B
包含名称空间为XmlsDefinitionAttribute
的{{1}}:
TestingAlternateContent
我刚试过它,它工作正常,没有修改汇编属性声明或Xaml,只是将它添加到另一个项目
答案 1 :(得分:1)
我不认为对于XAML设计器有一个很好的编译器指令,我已经使用附加属性实现了所需的结果,该属性改变了Visibility的性能,它非常好,因为它也在设计器中显示。 / p>
<Window x:Class="DebugTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DebugTest"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button local:MainWindow.IsDebugOnly="True" Width="100" Height="100" Content="Debug only"/>
</Grid>
此处的附加属性位于MainWindow类中,但它可以位于任何您想要的实用程序类中。
using System.Windows;
namespace DebugTest
{
public partial class MainWindow : Window
{
public static bool GetIsDebugOnly(DependencyObject obj)
{
return (bool)obj.GetValue(IsDebugOnlyProperty);
}
public static void SetIsDebugOnly(DependencyObject obj, bool value)
{
obj.SetValue(IsDebugOnlyProperty, value);
}
public static readonly DependencyProperty IsDebugOnlyProperty = DependencyProperty.RegisterAttached("IsDebugOnly", typeof(bool), typeof(MainWindow), new PropertyMetadata(false, new PropertyChangedCallback((s, e) =>
{
UIElement sender = s as UIElement;
if (sender != null && e.NewValue != null)
{
bool value = (bool)e.NewValue;
if (value)
{
#if DEBUG
bool isDebugMode = true;
#else
bool isDebugMode = false;
#endif
sender.Visibility = isDebugMode ? Visibility.Visible : Visibility.Collapsed;
}
}
})));
public MainWindow()
{
InitializeComponent();
}
}
}