WPF AlternateContent不起作用

时间:2016-03-22 09:03:46

标签: c# .net wpf xaml

我试图在调试和发布配置中显示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下测试了相同的代码,但没有一个能够运行。 我错过了什么?任何人都知道这里有什么问题,或者可以发布工作代码作为参考?

2 个答案:

答案 0 :(得分:8)

问题是在解析XAML之后解析XmlnsDefinitionAttribute,因此它对同一个程序集不起作用。

但是,您可以在解决方案中的任何其他(引用的)项目中生成XmlnsDefinition,并且它可以正常工作

那是:

  • ProjectA(命名空间:TestingAlternateContent
    • 包含您的MainWindow.Xaml
    • 参考ProjectB
  • 项目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();
        }
    }

}