我使用样式在文本框周围创建了一个漂亮的边框。请注意下面的边框,我简称为“边框”。当文本框接收到IsFocused-Trigger中指定的焦点时,它可以正常工作:
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ErrorTemplate}">
<Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
<Setter Property="AllowDrop" Value="true" />
<Setter Property="Background" Value="Transparent"></Setter>
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="FontFamily" Value="Segoe UI" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Padding" Value="3,3,3,3" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border
Name="Border"
CornerRadius="4"
Padding="0"
Background="{StaticResource WindowBackgroundBrush}"
BorderBrush="{StaticResource SolidBorderBrush}"
BorderThickness="1,1,1.4,1.4" >
<ScrollViewer Margin="0" x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="Border" Property="BorderThickness" Value="1.4,1.4,1.8,1.8"></Setter>
</Trigger>
<Trigger Property="IsReadOnly" Value="True">
<Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在我想在组合框中应用相同的边框样式。我已经读过可编辑的组合框会造成一些麻烦,我看到建议使用IsKeyboardFocusWithin代替IsFocused。当我这样做时,我可以触发一个阴影效果。这很有效。
但我的小边界不想。
我在ControlTemplate下面的Grid部分中放置了与上面相同的Border定义,处理ComboBox类型,然后希望我可以在组合框周围出现边框。目标名称显然已被识别,但仍未显示...
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter TargetName="Border" Property="BorderThickness" Value="1.4,1.4,1.8,1.8"></Setter>
</Trigger>
代码有什么问题?并且:边界的定义是否可以放入自己的样式,可以很容易地引用文本框或组合框(因为引用正确的目标名称似乎存在问题)?
任何帮助将不胜感激!
答案 0 :(得分:0)
复制/粘贴/运行这个:(我知道风格是夸张和不完整的,但目的是表明你可以做到,相对简单......并给你一些想法,并指出当需要时属性丢失,你也可以随时触发事件)
我把一个带有几个textBlocks的堆栈面板放在那里,当你运行它时,你可以点击它们与组合框不同,看看工作中的触发器。
可能很明显,但如果您想为边框粗细添加触发器,请确保将组合边距增加相同的数量。
<StackPanel>
<TextBox>sfddf</TextBox>
<Control>
<Control.Template>
<ControlTemplate>
<Grid>
<Border x:Name="Border" BorderBrush="Green" BorderThickness="3"/>
<ComboBox x:Name="Combo" BorderThickness="0" BorderBrush="Transparent" Margin="3"/>
</Grid>
<ControlTemplate.Triggers>
<EventTrigger SourceName="Combo" RoutedEvent="Control.GotFocus">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" From="Green" To="Red" Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger SourceName="Combo" RoutedEvent="Control.LostFocus">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderBrush.Color" From="Red" To="Green" Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
<TextBox>sdfsdfsd</TextBox>
</StackPanel>