【问题标题】:WPF - Pass value as parameter to a styleWPF - 将值作为参数传递给样式
【发布时间】:2021-12-29 04:09:45
【问题描述】:

我有两个具有相同属性的文本框。例如:

<!-- TextBox1 -->
<TextBox Foreground="Red"
         Style="{StaticResource MaterialTextBox}"
         materialDesign:HintAssist.Foreground="Blue"
         materialDesign:HintAssist.HintOpacity="100"
         materialDesign:TextFieldAssist.UnderlineBrush="Green">
    <materialDesign:HintAssist.Hint>
        <TextBlock Foreground="{DynamicResource Lime}"
                   Text="SomeHint1" />
    </materialDesign:HintAssist.Hint>
</TextBox>

<!-- TextBox2 -->
<TextBox Foreground="Red"
         Style="{StaticResource MaterialTextBox}"
         materialDesign:HintAssist.Foreground="Blue"
         materialDesign:HintAssist.HintOpacity="100"
         materialDesign:TextFieldAssist.UnderlineBrush="Green">
    <materialDesign:HintAssist.Hint>
        <TextBlock Foreground="{DynamicResource Lime}"
                   Text="SomeHint2" />
    </materialDesign:HintAssist.Hint>
</TextBox>

请注意,唯一的区别是 MaterialDesign:HintAssist.Hint 属性的 "SomeHint1""SomeHint2" 字符串。

所以我想我可以为此设计一个样式:

<Style TargetType="TextBox" x:Key="TextBoxWithMaterialHintStyle" BasedOn="{StaticResource MaterialTextBox}">
    <Setter Property="Foreground" Value="Red" />
    <Setter Property="materialDesign:HintAssist.Foreground" Value="Blue" />
    <Setter Property="materialDesign:HintAssist.HintOpacity" Value="100" />
    <Setter Property="materialDesign:TextFieldAssist.UnderlineBrush" Value="Green" />
    <Setter Property="materialDesign:HintAssist.Hint">
        <Setter.Value>
            <TextBlock Foreground="{DynamicResource Blue}"
                       Text="???" />
        </Setter.Value>
    </Setter>
</Style>

注意 TextBlock 的 Text 属性在我的风格中是 "???"
我不知道如何将 "SomeHint1""SomeHint2" 传递给 Style 并进一步传递给 TextBlock 的 Text 属性。

有解决办法吗?

【问题讨论】:

  • View Model/Code 后面的属性?

标签: wpf parameters material-design wpf-style


【解决方案1】:

您可以将它放在 ItemsControl 中并绑定字符串列表。

例如:

<ItemsControl ItemsSource="{Binding Hints}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <TextBox Foreground="Red"
                Style="{StaticResource MaterialTextBox}"
                materialDesign:HintAssist.Foreground="Blue"
                materialDesign:HintAssist.HintOpacity="100"
                materialDesign:TextFieldAssist.UnderlineBrush="Green">
            <materialDesign:HintAssist.Hint>
                <TextBlock Foreground="{DynamicResource Lime}"
                           Text="{Binding}" />
            </materialDesign:HintAssist.Hint>
        </TextBox>
    </ItemsControl.ItemTemplate>
</ItemsControl>

在您的 ViewModel 中可以是这样的属性:

public string[] Hints
{
     get { return new[] {"SomeHint1", "SomeHint2"}; }
}

【讨论】:

    【解决方案2】:

    您也可以将DynamicResource 用于Text

    <Setter.Value>
       <TextBlock Foreground="{DynamicResource Blue}" Text="{DynamicResource hintStr}"/>
    </Setter.Value>
    

    然后只是

    <TextBox ...>
       <TextBox.Resources>
          <Sys:String x:Key="hintStr" xmlns:Sys="clr-namespace:System;assembly=mscorlib">Hint1</Sys:String>
       </TextBox.Resources>
    </TextBox>
    

    【讨论】:

    • 成功了!谢谢你。我有个问题。要显示的文本是标记代码。通常,TextBox 的 Text 属性设置如下:Text="{local:MyMarkUpExtension {x:Static local:Hints.Hint1}} 您的字符串资源示例可以以某种方式更改以从标记中读取吗?
    • @Mc_Topaz 这取决于local:Hints.Hint1 是什么。只需发布一个新问题如何设置字符串资源并解释local:Hints.Hint1 是什么。
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2012-10-29
    相关资源
    最近更新 更多