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(); } } }