Wpf XAML MaterialDesign文本框样式的问题:启用时背景和helpertext

Wpf XAML MaterialDesign文本框样式的问题:启用时背景和helpertext,wpf,xaml,textbox,material-design,controltemplate,Wpf,Xaml,Textbox,Material Design,Controltemplate,我正在使用XAML中的材质设计库。我需要重新设置一些组件的样式,因为我使用的是一个特殊的文本框,其中有一个可单击的图标 <StackPanel Orientation="Horizontal" Width="328" Grid.Column="0" Background="#3B3A3A"> <TextBox Style="{StaticResource Style}"

我正在使用XAML中的材质设计库。我需要重新设置一些组件的样式,因为我使用的是一个特殊的文本框,其中有一个可单击的图标

<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>

问题是,将此代码用于样式(与控件模板一起使用)时,我没有可用的帮助器文本。我怎样才能把这两件事结合起来呢?(我的意思是当文本框聚焦且有帮助文本可用时,我的背景设置?)

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

您无法“组合”
控制模板
。必须将模板定义为一个整体

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


恐怕您不能将模板建立在其他模板的基础上,也不能将触发器添加到其他地方定义的模板。

它不起作用,因为您覆盖了
文本框的控件模板,并忽略了它正常工作所需的大部分模板。控件模板定义控件的视觉感知,以及控件之间的状态和转换。控制模板不能像样式一样基于其他模板。创建自定义控件模板意味着:

  • 使用所有必需的状态和部件从头开始创建,或
  • 复制基础/默认样式并进行调整
对于标准WPF控件,您可以在文档中找到所需的部件和状态,例如
TextBox
。省略任何必需的组件都会导致意外行为或破坏视觉状态。在材料设计的情况下,为了使控件正常工作,需要做更多的事情,但它们没有像MSDN那样记录,因此您必须创建默认样式的副本并进行调整

您可以找到
文本框
的默认样式。因此,在较新版本中,样式重命名为
MaterialDesignFilledTextBox
。派生样式层次结构如下所示:

  • MaterialDesignTextBoxBase
    • materialdesignfloatinghintextbox
      • materialdesignfloatinghintextbox
        • MaterialDesignFilledTextFieldTextBox

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

@MariannaPascucci:这是否回答了您的问题?@MariannaPascucci:请记住。非常感谢!它确实帮助了我:)