我在开发时广泛使用 C# 预处理器指令。我直接在
.cs
文件中定义它们,或者在 .csproj
: 中全局定义它们
<PropertyGroup>
<DefineConstants>fix_issue_001;fix_issue_002;</DefineConstants>
</PropertyGroup>
或者通过命令行,如此处所述。
然后我用它们来划分代码:
#if fix_issue_001
// some new code
#else
// some old code
#endif
这可以帮助我跟踪更改,尽管我承认这不是最具可读性或规范的方法。版本控制和分支会更好,但我们仅限于 SVN 和 Visual Studio。
现在我想将此模式扩展到 WPF XAML 文件。由于预处理器指令在 XML 中不可用,因此我正在考虑使用 XSLT 来实现类似的功能。
例如,我想在我的 XAML 中包含这样的内容:
<StackPanel>
<!-- fix_issue_001:true -->
<Button Content="Original version" Click="Button_Click" />
<!-- end fix_issue_001:true -->
<!-- fix_issue_001:false -->
<Button Content="New version" Background="LightGreen" Click="Button_Click" />
<!-- end fix_issue_001:false -->
</StackPanel>
目标是让 XSLT 在构建时对此进行转换,根据是否定义
fix_issue_001
包含/排除部分,就像 #if/#else
在 C# 中工作一样。
要求:
.csproj
/.sln
和/或其他配置的解决方案,以便在 Visual Studio 中无缝工作xsltproc
或 Saxon-HE)这可能吗?你会如何实施?
它既不优雅也不完全符合您的要求,但也许您可以朝这个方向走:
<Button Content="Original version" Click="Button_Click" Visibility="{Binding fix_issue_001, Converter={StaticResource boolToVisibility}}"/>
<Button Content="New version" Background="LightGreen" Click="Button_Click" Visibility="{Binding fix_issue_001, Converter={StaticResource boolToInvisibility}}"/>
您也可以创建一个转换器,接受名称和值作为 ConverterParameter,然后检查定义并相应地隐藏控件。