【问题标题】:How to set style of a WPF control according to target?如何根据目标设置 WPF 控件的样式?
【发布时间】:2020-02-24 08:40:24
【问题描述】:

我有一个需要针对 .NET Framework 3.5 和 4.5 的项目,我想根据构建目标设置 WPF 控件的属性。例如我有一个文本块,如果构建目标是 3.5,我希望它的背景是 Azure,如果构建目标是 4.5,我希望它的背景是青色我该怎么做?

<Window x:Class="WpfAppMultipleTarget.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfAppMultipleTarget"
    mc:Ignorable="d"
    Title="MainWindow" Height="300" Width="300">
<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background" Value="Azure"/> <!-- If target is net framework 3.5 -->
            <Setter Property="Background" Value="Cyan"/> <!-- If target is net framework 4.5 -->
        </Style>
    </Grid.Resources>
    <TextBlock>Hello</TextBlock>
</Grid>

【问题讨论】:

  • 嗨,欢迎来到 SO。据我了解,您可能无法仅在 XAML 中执行此操作。您需要检查后面代码中的版本并将其绑定到 TextBlock。在这种情况下,可能也不需要定义的样式。如果你觉得这没问题,请更新一下可能能提供帮助的人。

标签: wpf properties multitargeting


【解决方案1】:

可以使用 Interaction.Behaviors 来做到这一点,您可以在包含在样式中的 XAML 中设置此属性。 在行为内部,您可以阅读框架版本。 这是一个例子。

<Style TargetType="{x:Type TextBox}">
  <Style.Setters>
    <Setter Property="i:Interaction.Behaviors">
      <Setter.Value>
          <local:BehaviorName/>
          <local:BehaviorName/>
      </Setter.Value>
    </Setter>
  </Style.Setters>
</Style>

您可以使用此代码读取行为内部的框架版本

    string version = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(c => c.Name.Contains("mscorlib")).FirstOrDefault().Version.ToString();

希望这会有所帮助。

【讨论】:

  • 谢谢。我认为您的建议也可能有所帮助。
【解决方案2】:

您可以使用返回 CLR 版本的Environment.Version。这里的想法是在绑定到布尔值的 xaml 中定义DataTrigger,如果版本以 4 开头,则为 true,否则为 false(.net 3.5 具有以 2 开头的 CLR 版本),请查看 CLR 版本@ 987654322@.

您的 xaml 应该如下所示:

<....
        Title="MainWindow" Height="450" Width="800" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
</Window.Resources>

<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsAbove4}" Value="True" >
                    <Setter Property="Background" Value="Cyan"/>
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="Background" Value="Azure"/>
        </Style>
    </Grid.Resources>
    <TextBlock>Hello</TextBlock>
</Grid>

在虚拟机/代码中定义属性:

public bool IsAbove4 { get; set; } = Environment.Version.ToString().StartsWith("4");

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 1970-01-01
    • 2021-12-23
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多