граница текстового поля неправильно устанавливается в фокусе - WPF

У меня есть собственное текстовое поле, которое я создал в Expression Blend для WPF, и я пытаюсь заставить состояния фокуса работать правильно. Когда я вхожу в текстовое поле, сфокусированная часть стиля работает (и граница изменяется); однако, если у меня нет фокуса в текстовом поле и я щелкаю текстовое поле, стиль не применяется. Если я щелкну по краям текстового поля (в граничной части), оно будет установлено правильно. По какой-то причине мой scrollviewer неправильно запускает событие фокуса.

Ниже мой стиль:

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

person spyter    schedule 17.01.2014    source источник


Ответы (2)


Попробуйте это. Может быть, это может быть полезно для вас. Спасибо.

    <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>
person Heena Patil    schedule 18.01.2014

Лично я никогда не использую Blend или окно конструктора в Visual Studio, потому что они изменяют код так, как не стал бы я. Я всегда пишу XAML, поэтому точно знаю, что происходит. Когда я определяю новый ControlTemplate для элемента управления, я всегда следую этим простым шагам, и у меня никогда не было никаких проблем.

  1. Сначала найдите ControlTemplate по умолчанию в стилях текстового поля и Шаблоны в MSDN.

  2. Затем добавьте Style для TextBox, который задает для свойства Template новое значение ControlTemplate, а затем скопируйте и вставьте туда все значение по умолчанию ControlTemplate.

  3. Вам, вероятно, также потребуется скопировать некоторые ресурсы со связанной страницы... в основном для этого шага сделайте так, чтобы элемент управления TextBox выглядел и как обычно.

  4. Наконец, настройте свой ControlTemplate как хотите, но всегда маленькими шагами, чтобы вы могли продолжать проверять, не удалили ли вы что-либо, что может нарушить некоторые функции.

Вот и все. Теперь у вас должен быть полностью работающий пользовательский TextBox. Удачи.

person Sheridan    schedule 17.01.2014