c# - WPF中使用样式的边框粗细
问题描述
我正在做一个小项目,我正在使用数据验证。TextBox
现在,当输入不正确时,我正在尝试为 制作样式。我想在TextBox
和一个ToolTip
带有错误消息的周围制作一个红色边框,这是我从 C# 代码返回的。
我开始制作红色边框。我在 XAML 中写了这个:
<Window.Resources>
<Style x:Key="ErrorTemplate" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="BorderBrush" Value="Red"></Setter>
<Setter Property="BorderThickness" Value="5"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
但是如果我这样写,BorderThickness
属性正在改变TextBox
. 使用上面的代码,我得到了这个:
有没有办法避免这种情况,并得到这样的东西?
在某种程度上,我可以ToolTip
使用相同的Style
.
编辑:代码TextBox
:
<TextBox
Grid.Row="1"
Grid.Column="3"
Margin="10px"
FontSize="14pt"
VerticalAlignment="Center"
Padding="5px"
Text="{Binding Path=Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Style="{StaticResource ErrorTemplate}">
<TextBox.DataContext>
<local:Data/>
</TextBox.DataContext>
</TextBox>
解决方案
你看到的蓝色边框就是它TextBox
本身的边框,在它的键盘聚焦状态下默认是浅蓝色的。边框厚 5 度,因为您明确地将其设置为您提供的ErrorTemplate
样式。它周围的红线是TextBox
.
为了满足您的要求,请创建如下样式。
- 设置一个一般
Margin
的 5 dips 来说明错误显示的边框,否则它可能会在容器之外被切断,因为它只是原始的覆盖TextBox
并且没有调整大小。 - 为非错误状态设置可选的默认工具提示。
- 设置一个
ErrorTemplate
,这是一个专用于错误状态的特殊模板,其中AdornedElementPlaceholder
表示模板中的原始TextBox
。 - 设置一个触发器,将工具提示文本更改为错误状态下的验证错误。
<Style x:Key="MyTextBoxValidationStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Margin" Value="5"/>
<Setter Property="ToolTip" Value="There is no error."/>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<Border BorderBrush="Red" BorderThickness="5">
<AdornedElementPlaceholder/>
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
将样式应用于您的TextBox
使用Style
属性。
<TextBox Style="{StaticResource MyTextBoxValidationStyle}" ...>
这是结果的示例屏幕截图。
推荐阅读
- api - 是否可以通过 API 或 CLI 更改 Rundeck Job 的超时值?
- android - 如何使用 workmanager 作为上传服务
- python - 用于从 odoo 进行 ftp 备份的 ftputil 包
- r - 将 gtExtras::gt_sparkline 应用于多列
- html - 单击播放按钮时会自动以全屏模式播放视频
- python - 为什么我要脱离循环?
- reactjs - Accordion 的第二个子元素上的网格属性不起作用
- node.js - 为什么将 Postgres 数据库上传到 Heroku 时出现应用程序错误?
- python - 如何正确旋转熊猫数据框
- laravel - laravel 中的 SMS 警报 API 验证