Wpf XAML MaterialDesign文本框样式的问题:启用时背景和helpertext
我正在使用XAML中的材质设计库。我需要重新设置一些组件的样式,因为我使用的是一个特殊的文本框,其中有一个可单击的图标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}"
<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:请记住。非常感谢!它确实帮助了我:)