TextBox的边框样式不会显示在WPF中的可编辑ComboBox中

时间:2011-09-01 09:19:01

标签: wpf combobox textbox styles border

我使用样式在文本框周围创建了一个漂亮的边框。请注意下面的边框,我简称为“边框”。当文本框接收到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>

代码有什么问题?并且:边界的定义是否可以放入自己的样式,可以很容易地引用文本框或组合框(因为引用正确的目标名称似乎存在问题)?

任何帮助将不胜感激!

1 个答案:

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