【问题标题】:Issues with XAML MaterialDesign TextBox style: background when enabled and helpertextXAML MaterialDesign TextBox 样式的问题:启用时的背景和 helpertext
【发布时间】:2020-10-05 13:39:27
【问题描述】:

我在 XAML 中使用 Material Design 库。我需要重新设置一些组件的样式,因为我使用的是一个特定的文本框,其中有一个可点击的图标。

<StackPanel Orientation="Horizontal" Width="328"  Grid.Column="0" Background="#3B3A3A">
   <TextBox Style="{StaticResource Style}" materialDesign:HintAssist.Hint="Text" Width="300" 
            TextWrapping="Wrap" materialDesign:HintAssist.HelperText="Text1"/>
   <Button Opacity="1" Padding="2,0,0,0"
           Height="53.2"
           Background="Transparent" 
           BorderBrush="Transparent"
           Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}"
           CommandTarget="{Binding ElementName=DialogSelection}">
      <materialDesign:PackIcon Kind="ArrowExpand"/>
   </Button>

首先我需要在文本框为焦点时删除背景,所以在样式中我做了这样的事情:

<Style x:Key="Style" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignFilledTextFieldTextBox}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type TextBox}">
            <Border x:Name="border" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Background="{TemplateBinding Background}" 
                    Width="328"
                    materialDesign:BottomDashedLineAdorner.Thickness="{TemplateBinding Margin}">
               <TextBox x:Name="text" TextWrapping="WrapWithOverflow" FontSize="16" FontWeight="Regular" Foreground="White"/>
            </Border>
            <ControlTemplate.Triggers>
               <Trigger Property="IsEnabled" Value="True">
                  <Setter Property="BorderBrush" TargetName="border"  Value="#656565"/>
                  <Setter Property="Background" Value="#3b3a3a"/>
               </Trigger>
               <Trigger Property="IsFocused" Value="True">
                  <Setter Property="BorderBrush" TargetName="border" Value="#00B5CE"/>
                  <Setter Property="Background" Value="#656565"/>
                  <Setter Property="BorderThickness" Value="2"/>
               </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

问题是使用此样式代码(使用控件模板)我没有可用的帮助文本。我怎样才能把这两件事结合起来? (我的意思是当文本框 isFocused 和 HelperText 可用时我的背景设置?)

注意:如果我不修改模板而只设置背景,则文本框 isFocused 时的背景不是我想要的,但 HelperText 是可见的

【问题讨论】:

    标签: wpf xaml textbox material-design controltemplate


    【解决方案1】:

    它不起作用,因为您覆盖了TextBox 的控制模板并省略了它正常工作所需的大部分内容。控件模板定义控件的视觉外观,以及它们之间的状态和转换。您不能像使用样式一样将控制模板基于另一个模板。创建自定义控件模板意味着:

    • 使用所有必需的状态和部分从头开始创建它,或者
    • 复制基本/默认样式并进行调整。

    对于标准 WPF 控件,您可以在文档中找到所需的部分和状态,例如对于TextBoxhere。省略任何必需的组件将导致意外行为或损坏的视觉状态。在 Material Design 的情况下,要使控件正常工作,还需要做更多的事情,但它们没有像 MSDN 上那样记录,因此您必须创建默认样式的副本并进行调整。

    您可以找到TextBox here on Github 的默认样式。在较新的版本中,样式被重命名为MaterialDesignFilledTextBox,因为这个issue。派生的样式层次结构如下:

    • MaterialDesignTextBoxBase
      • MaterialDesignFloatingHintTextBox
        • MaterialDesignFloatingHintTextBox
          • MaterialDesignFilledTextFieldTextBox

    控件模板在MaterialDesignTextBoxBase 中定义,它是所有其他样式的基本样式。您现在要做的是复制MaterialDesignTextBoxBase 样式,给它一个名称并按照您提供的代码调整状态。您可以将上述三种派生样式的设置器合并到您的自定义样式中。然后,您将拥有一个自定义样式,该样式包含所有必要的状态和按您预期工作的部分。

    【讨论】:

    • 非常感谢!它真的帮助了我:)
    【解决方案2】:

    您不能“合并”ControlTemplates。您必须将模板定义为一个整体。

    这意味着您应该复制 MaterialDesignFilledTextFieldTextBox 中包含帮助文本的默认模板,然后根据您的要求对其进行修改,即向其添加 IsFocused 触发器。

    恐怕您不能将一个模板基于另一个模板,或者将触发器添加到其他地方定义的模板。

    【讨论】:

    • @MariannaPascucci:这能回答你的问题吗?
    • @MariannaPascucci:请记住accept the answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2012-03-10
    • 2011-11-02
    相关资源
    最近更新 更多