如何使用 XSLT 在构建时有条件地转换 XAML 以镜像 C# 预处理器指令?

问题描述 投票:0回答:1

我在开发时广泛使用 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# 中工作一样。

要求:

  • 维护 Visual Studio 的 XAML 设计器功能
  • 尽量减少对现有代码的更改
  • 首选使用
    .csproj
    /
    .sln
    和/或其他配置的解决方案,以便在 Visual Studio 中无缝工作
  • 如有必要,可以接受命令行(批处理/PowerShell)解决方案(例如,使用
    xsltproc
    Saxon-HE

这可能吗?你会如何实施?

c# wpf visual-studio xaml xslt
1个回答
0
投票

它既不优雅也不完全符合您的要求,但也许您可以朝这个方向走:

<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,然后检查定义并相应地隐藏控件。

© www.soinside.com 2019 - 2024. All rights reserved.