рамката на текстовото поле не е зададена правилно на фокус - 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