【问题标题】:textbox border not setting correctly on focus - WPF文本框边框未正确设置焦点 - WPF
【发布时间】:2014-01-17 16:24:44
【问题描述】:

我在 Expression Blend 中为 WPF 创建了一个自定义文本框,我正在尝试让焦点状态正常工作。当我进入文本框时,样式的 Focused 部分起作用(并且边框发生变化);但是,如果我在文本框中没有焦点并单击文本框,则它不会应用样式。如果我单击文本框的边缘(在边框部分),它将正确设置。由于某种原因,我的滚动查看器没有正确触发焦点事件。

以下是我的风格:

<Style x:Key="TextBoxDark" TargetType="{x:Type TextBox}">
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="BorderBrush" Value="#FF171717" />
        <Setter Property="Background" Value="#FF212121" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid x:Name="grid">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.2"/>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="0.395"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="ReadOnly">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="scrollViewer">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FF0B5A8F"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Unfocused"/>
                                <VisualState x:Name="Focused" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                            <ScrollViewer x:Name="scrollViewer" Margin="{TemplateBinding Padding}" Foreground="{TemplateBinding Foreground}"
                                ToolTipService.ToolTip="{TemplateBinding Text}" VerticalScrollBarVisibility="Hidden" Content="{TemplateBinding Text}" VerticalAlignment="Center"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="BorderBrush" Value="#FF007ACC"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
        </Style.Triggers>
    </Style>

【问题讨论】:

    标签: wpf expression


    【解决方案1】:

    试试这个。可能对你有帮助。谢谢。

        <Window.Resources>
            <Style x:Key="TextBoxDark" TargetType="TextBox">
                <Setter Property="BorderThickness" Value="1" />
                <Setter Property="BorderBrush" Value="#FF171717" />
                <Setter Property="Background" Value="#FF212121" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TextBox">
                            <Border Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                                <ScrollViewer  Margin="{TemplateBinding Padding}" VerticalScrollBarVisibility="Hidden" ToolTipService.ToolTip="{TemplateBinding Text}" x:Name="PART_ContentHost" Foreground="{TemplateBinding Foreground}"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsFocused" Value="True">
                                    <Setter TargetName="Border" Property="BorderBrush" Value="#FF007ACC"/>
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1"/>
                                </Trigger>
                                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                                    <Setter TargetName="Border" Property="BorderBrush" Value="#FF007ACC"/>
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1"/>
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="Border" Property="BorderBrush" Value="#FF0B5A8F"/>
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1"/>
                                </Trigger>
                                <Trigger Property="IsReadOnly" Value="True">
                                    <Setter TargetName="PART_ContentHost"  Property="Opacity" Value="0.5"></Setter>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="Border" Property="BorderBrush" Value="#FF171717"/>
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
       <TextBox Style="{StaticResource TextBoxDark}" Foreground="Red" Height="35" Width="100"></TextBox>
    

    【讨论】:

      【解决方案2】:

      就个人而言,我从不在 Visual Studio 中使用 Blend 或设计器窗口,因为它们以我不会的方式更改代码。我总是编写 XAML,所以我确切地知道发生了什么。当我为控件定义一个新的ControlTemplate 时,我总是遵循这些简单的步骤,并且从未遇到任何问题。

      1. 首先,从 MSDN 上的TextBox Styles and Templates 页面找到默认的ControlTemplate

      2. 接下来,为TextBox 添加一个Style,将Template 属性设置为一个新的ControlTemplate,然后复制并粘贴整个 默认ControlTemplate .

      3. 您可能还需要从链接页面复制一些资源...基本上对于这一步,让TextBox 控件看起来正常。 p>

      4. 最后,随心所欲地调整您的ControlTemplate,但始终以小步骤进行,这样您就可以继续检查您没有删除任何可能破坏某些功能的内容。

      就是这样。您现在应该有一个完全可用的自定义TextBox。祝你好运。

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多