WPF AlternateContent不起作用

我试图在调试和发布配置中显示WPF控件中的不同视图元素以进行测试。 我使用过这篇文章作为指南: XAML是否有针对调试模式的条件编译器指令? (所以)

为了测试它,我创建了一个VS2013解决方案,其中包含一个名为TestingAlternateContent的WPF应用程序项目。 在我的AssemblyInfo.cs中,我添加了以下代码:

#if DEBUG [assembly: XmlnsDefinition("debug-mode", "TestingAlternateContent")] #endif 

在我的MainWindow.xaml中,我创建了一个简单的代码示例来测试此行为,如下所示:

             

在测试时,我总是看到窗口显示“释放模式!” 消息,无论我使用哪种配置(Debug,Relase)。 我已经检查过AssemblyInfo #if DEBUG是否正常工作,当我在Debug / Release配置之间进行更改时会相应地进行更改。 我已经使用.NET Framework 3.5 / 4.5版本在VS2008 / VS2013下测试了相同的代码,但没有一个有效。 我错过了什么? 任何人都知道这里有什么问题或者可以发布工作代码作为参考?

问题是在解析XAML之后解析了XmlnsDefinitionAttribute ,因此它不适用于同一个程序集。

但是,您可以在解决方案中的任何其他(引用的)项目中创建XmlnsDefinition ,它将起作用

那是:

  • ProjectA(命名空间: TestingAlternateContent
    • 包含您的MainWindow.Xaml
    • 参考ProjectB
  • 项目B

    • 包含具有XmlsDefinitionAttribute命名空间的TestingAlternateContent

       #if DEBUG [assembly: XmlnsDefinition("debug-mode", "TestingAlternateContent")] #endif 

我只是测试了它,它工作正常,没有修改汇编属性声明或Xaml,只是将它添加到另一个项目

不幸的是,我不认为XAML设计器有一个很好的编译器指令,我已经使用附加属性实现了所需的结果,该属性改变了Visibility的性能,它非常好,因为它也在设计器中显示。

     

这里的附加属性位于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(); } } }