Если использовать темы из Silverlight Toolkit, то сразу бросается в глаза, что при их применениее сразу убивается View для валидации в TextBox.
Не знаю с чем связано такое безобразие, но вернуть это все несложно. Для этого нужно выполить следующее:
Рассмотрим стандартно применяемые стиль и шаблоны для TextBox на странице TextBox Styles and Templates (En)
Оттуда скопируем в наш файл, взятой из Silverlight Toolkit темы, “ControlTemplate for ValidationTooltip”.
<ControlTemplate x:Key=”ValidationToolTipTemplate”>
…
</ControlTemplate>
Поскольку к этому шаблону из стиля TextBox идет обращение, как к статическому ресурсу по имени ValidationToolTipTemplate, то размещать его XAML надо до XAML стиля TextBox.
Далее нам осталось только дополнить недостающие части XAML стиля для TextBox
<Style TargetType=”TextBox”>
…
</Style>
Сравните аккуратно исходный стиль и стиль в вашей теме и вы легко определите место куда вставить недостающие VisualState’ы и <Border x:Name=”ValidationErrorElement” … >
Для полноты картины я приведу то что должно получиться, а то что быо до этого приведу в следующем посту, тк получается слишком большой объем
Вот что должно получиться:
___________
<!–TextBox–>
<!– i!t для TextBox пришлось добавлять (возвращать) разметку и VisualState’s для валидации
http://iliya-tretyakov.spaces.live.com/blog/cns!6DDCA30C11FA5050!504.entry
–>
<ControlTemplate x:Key=”ValidationToolTipTemplate”>
<Grid x:Name=”Root” Margin=”5,0″ RenderTransformOrigin=”0,0″ Opacity=”0″>
<Grid.RenderTransform>
<TranslateTransform x:Name=”xform” X=”-25″/>
</Grid.RenderTransform>
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup Name=”OpenStates”>
<vsm:VisualStateGroup.Transitions>
<vsm:VisualTransition GeneratedDuration=”0″/>
<vsm:VisualTransition To=”Open” GeneratedDuration=”0:0:0.2″>
<Storyboard>
<DoubleAnimation Storyboard.TargetName=”xform” Storyboard.TargetProperty=”X” To=”0″ Duration=”0:0:0.2″>
<DoubleAnimation.EasingFunction>
<BackEase Amplitude=”.3″ EasingMode=”EaseOut”/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName=”Root” Storyboard.TargetProperty=”Opacity” To=”1″ Duration=”0:0:0.2″/>
</Storyboard>
</vsm:VisualTransition>
</vsm:VisualStateGroup.Transitions>
<vsm:VisualState x:Name=”Closed”>
<Storyboard>
<DoubleAnimation Storyboard.TargetName=”Root” Storyboard.TargetProperty=”Opacity” To=”0″ Duration=”0″/>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”Open”>
<Storyboard>
<DoubleAnimation Storyboard.TargetName=”xform” Storyboard.TargetProperty=”X” To=”0″ Duration=”0″/>
<DoubleAnimation Storyboard.TargetName=”Root” Storyboard.TargetProperty=”Opacity” To=”1″ Duration=”0″/>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Border Margin=”4,4,-4,-4″ Background=”#052A2E31″ CornerRadius=”5″/>
<Border Margin=”3,3,-3,-3″ Background=”#152A2E31″ CornerRadius=”4″/>
<Border Margin=”2,2,-2,-2″ Background=”#252A2E31″ CornerRadius=”3″/>
<Border Margin=”1,1,-1,-1″ Background=”#352A2E31″ CornerRadius=”2″/>
<Border Background=”#FFDC000C” CornerRadius=”2″/>
<Border CornerRadius=”2″>
<TextBlock
UseLayoutRounding=”false”
Foreground=”White” Margin=”8,4,8,4″ MaxWidth=”250″ TextWrapping=”Wrap” Text=”{Binding (Validation.Errors)[0].ErrorContent}”/>
</Border>
</Grid>
</ControlTemplate>
<Style TargetType=”TextBox”>
<Setter Property=”BorderThickness”
Value=”1″/>
<Setter Property=”Background”
Value=”{StaticResource ShadeBrush}”/>
<Setter Property=”Foreground”
Value=”#FF000000″/>
<Setter Property=”Padding”
Value=”2″/>
<Setter Property=”BorderBrush”
Value=”{StaticResource NormalBorderBrush}” />
<Setter Property=”Template”>
<Setter.Value>
<ControlTemplate TargetType=”TextBox”>
<Grid >
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name=”CommonStates”>
<vsm:VisualStateGroup.Transitions>
<vsm:VisualTransition GeneratedDuration=”00:00:00.1″
To=”MouseOver”/>
<vsm:VisualTransition GeneratedDuration=”00:00:00.1″
To=”ReadOnly”/>
<vsm:VisualTransition GeneratedDuration=”00:00:00.1″
To=”Disabled”/>
<vsm:VisualTransition From=”Normal”
GeneratedDuration=”00:00:00.3000000″
To=”MouseOver”/>
<vsm:VisualTransition From=”MouseOver”
GeneratedDuration=”00:00:00.5000000″
To=”Normal”/>
</vsm:VisualStateGroup.Transitions>
<vsm:VisualState x:Name=”Normal”/>
<vsm:VisualState x:Name=”MouseOver”>
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime=”00:00:00″
Duration=”00:00:00.0010000″
Storyboard.TargetName=”HoverBorder”
Storyboard.TargetProperty=”(UIElement.Opacity)”>
<SplineDoubleKeyFrame KeyTime=”00:00:00″
Value=”1″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”Disabled”>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName=”DisabledVisualElement”
Storyboard.TargetProperty=”Opacity”>
<SplineDoubleKeyFrame KeyTime=”0″
Value=”0.6″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”ReadOnly”>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName=”ReadOnlyVisualElement”
Storyboard.TargetProperty=”Opacity”>
<SplineDoubleKeyFrame KeyTime=”0″
Value=”1″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
<vsm:VisualStateGroup x:Name=”FocusStates”>
<vsm:VisualStateGroup.Transitions>
<vsm:VisualTransition From=”Focused”
GeneratedDuration=”00:00:00.5000000″
To=”Unfocused”/>
<vsm:VisualTransition From=”Unfocused”
GeneratedDuration=”00:00:00.3000000″
To=”Focused”/>
</vsm:VisualStateGroup.Transitions>
<vsm:VisualState x:Name=”Focused”>
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime=”00:00:00″
Duration=”00:00:00.0010000″
Storyboard.TargetName=”FocusVisualElement”
Storyboard.TargetProperty=”(UIElement.Opacity)”>
<SplineDoubleKeyFrame KeyTime=”00:00:00″
Value=”1″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”Unfocused”>
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime=”00:00:00″
Duration=”00:00:00.0010000″
Storyboard.TargetName=”FocusVisualElement”
Storyboard.TargetProperty=”(UIElement.Opacity)”>
<SplineDoubleKeyFrame KeyTime=”00:00:00″
Value=”0″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
<vsm:VisualStateGroup x:Name=”ValidationStates”>
<vsm:VisualState x:Name=”Valid”/>
<vsm:VisualState x:Name=”InvalidUnfocused”>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName=”ValidationErrorElement” Storyboard.TargetProperty=”Visibility”>
<DiscreteObjectKeyFrame KeyTime=”0″>
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name=”InvalidFocused”>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName=”ValidationErrorElement” Storyboard.TargetProperty=”Visibility”>
<DiscreteObjectKeyFrame KeyTime=”0″>
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName=”validationTooltip” Storyboard.TargetProperty=”IsOpen”>
<DiscreteObjectKeyFrame KeyTime=”0″>
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>True</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Border x:Name=”Border”
Opacity=”1″
Background=”{TemplateBinding Background}”
BorderBrush=”{TemplateBinding BorderBrush}”
BorderThickness=”{TemplateBinding BorderThickness}”
CornerRadius=”2,2,2,2″>
<Grid>
<Border x:Name=”ReadOnlyVisualElement”
Opacity=”0″
Background=”#72F7F7F7″/>
<Border BorderThickness=”1″
CornerRadius=”1,1,1,1″>
<Border.BorderBrush>
<SolidColorBrush Color=”Transparent”
x:Name=”MouseOverColor”/>
</Border.BorderBrush>
<ScrollViewer BorderThickness=”0″
IsTabStop=”False”
Padding=”{TemplateBinding Padding}”
x:Name=”ContentElement”/>
</Border>
</Grid>
</Border>
<Border x:Name=”HoverBorder”
Opacity=”0″
BorderBrush=”{StaticResource NormalBrush}”
BorderThickness=”2,2,2,2″
CornerRadius=”2,2,2,2″/>
<Border x:Name=”DisabledVisualElement”
IsHitTestVisible=”False”
Opacity=”0″
Background=”#FFFFFFFF”
BorderBrush=”#A5F7F7F7″
BorderThickness=”{TemplateBinding BorderThickness}”
CornerRadius=”2,2,2,2″/>
<Border Margin=”1″
x:Name=”FocusVisualElement”
IsHitTestVisible=”False”
Opacity=”0″
BorderBrush=”{StaticResource NormalBrush}”
BorderThickness=”2.1,2.1,2.1,2.1″
CornerRadius=”0.2,0.2,0.2,0.2″/>
<Border x:Name=”ValidationErrorElement” BorderThickness=”1″ CornerRadius=”1″ BorderBrush=”#FFDB000C” Visibility=”Collapsed”>
<ToolTipService.ToolTip>
<ToolTip x:Name=”validationTooltip” Template=”{StaticResource ValidationToolTipTemplate}” Placement=”Right”
PlacementTarget=”{Binding RelativeSource={RelativeSource TemplatedParent}}”
DataContext=”{Binding RelativeSource={RelativeSource TemplatedParent}}”>
<ToolTip.Triggers>
<EventTrigger RoutedEvent=”Canvas.Loaded”>
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName=”validationTooltip” Storyboard.TargetProperty=”IsHitTestVisible”>
<DiscreteObjectKeyFrame KeyTime=”0″>
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>true</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</ToolTip.Triggers>
</ToolTip>
</ToolTipService.ToolTip>
<Grid Width=”12″ Height=”12″ HorizontalAlignment=”Right” Margin=”1,-4,-4,0″ VerticalAlignment=”Top” Background=”Transparent”>
<Path Margin=”1,3,0,0″ Data=”M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z” Fill=”#FFDC000C”/>
<Path Margin=”1,3,0,0″ Data=”M 0,0 L2,0 L 8,6 L8,8″ Fill=”#ffffff”/>
</Grid>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Pingback: Дополнение к предыдущему посту “Темы в Silverlight Toolkit October убивают валидацию в TextBox. Т.е. валидационный View. Видимо так было раньше и пока так буд
Pingback: Дополнение к предыдущему посту “Темы в Silverlight Toolkit October убивают валидацию в TextBox. Т.е. валидационный View. Видимо так было раньше и пока так буд