开发者

How to read property of control defined inside style in silverlight.?

I am using NumericUpDow开发者_C百科n control in my silver-light application. Code is as follows

 <StackPanel Style="{StaticResource StackPanelStyle_LableValue}">
                        <TextBlock Text="{Binding Path=ViewItem.Strength, Source={StaticResource LocalizedStrings }}" Style="{StaticResource TextBlockStyle}" />
                        <inputToolkit:NumericUpDown Style="{StaticResource NumericUpdownStyle_Strength}"
                                                    Value="{Binding RightSpecGlassStrength, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" 
                                                    TabIndex="5" />
                    </StackPanel>

and Style that i bind to NumericUpDown control as follows

 <Style x:Key="NumericUpdownStyle_Strength" TargetType="inputToolkit:NumericUpDown">
    <Setter Property="Width" Value="Auto"></Setter>
    <Setter Property="MinWidth" Value="50"></Setter>
    <Setter Property="Height" Value="20"></Setter>
    <Setter Property="Minimum" Value="-28"></Setter>
    <Setter Property="Maximum" Value="28"></Setter>            
    <Setter Property="BorderThickness" Value="0"></Setter>
    <Setter Property="BorderBrush" Value="White"></Setter>
    <Setter Property="DecimalPlaces" Value="2"></Setter>
    <Setter Property="Increment" Value="0.25"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="inputToolkit:NumericUpDown">
                <Grid>
                    <VisualStateManager.VisualStateGroups>


                        <VisualStateGroup x:Name="CommonStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0"/>
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)" To="1"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="1"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unfocused"/>
                        </VisualStateGroup>

                        <VisualStateGroup x:Name="ValidationStates">
                            <VisualState x:Name="Valid"/>
                            <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>
                            </VisualState>
                            <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>
                            </VisualState>
                        </VisualStateGroup>

                    </VisualStateManager.VisualStateGroups>
                    <inputToolkit:ButtonSpinner x:Name="Spinner" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" MinWidth="35">
                        <StackPanel Background="White" Orientation="Horizontal" HorizontalAlignment="Right" Width="Auto">                                   
                            <TextBox x:Name="Text"  Style="{StaticResource TextBoxStyle}" TabIndex="0"
                                 BorderThickness="0" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" MinWidth="50" Width="Auto"  AcceptsReturn="False" Text="{TemplateBinding Value}" TextAlignment="Left" TextWrapping="NoWrap"/>
                        </StackPanel>
                    </inputToolkit:ButtonSpinner>
                    <Border x:Name="DisabledVisualElement" IsHitTestVisible="false" Opacity="0" Background="#A5FFFFFF" CornerRadius="2.5,2.5,2.5,2.5"/>
                    <Border x:Name="FocusVisualElement" IsHitTestVisible="False" Opacity="0" BorderBrush="#FF45D6FA" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1,1,1,1"/>
                    <Border x:Name="ValidationErrorElement" Visibility="Collapsed" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1">
                        <ToolTipService.ToolTip>
                            <ToolTip x:Name="validationTooltip" Height="Auto" Width="Auto" Template="{StaticResource ValidationToolTipTemplate}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                                <ToolTip.Triggers>
                                    <EventTrigger RoutedEvent="Canvas.Loaded">
                                        <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>
                                </ToolTip.Triggers>
                            </ToolTip>
                        </ToolTipService.ToolTip>
                        <Grid Height="12" HorizontalAlignment="Right" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12" Background="Transparent">
                            <Path Fill="#FFDC000C" Margin="1,3,0,0" Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z"/>
                            <Path Fill="#ffffff" Margin="1,3,0,0" Data="M 0,0 L2,0 L 8,6 L8,8"/>
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

I found bug while running appliction build using above code.

To solve that bug I want read value that entered TextBox defined inside <inputToolkit:ButtonSpinner > </inputToolkit:ButtonSpinner > "Text" defined in the style of App.xaml for the NumericUpDown control.

How do i read value from textBox at run time on ValueChainging/ValueChanged/GotFocus/LostFocust or any other event of NumericUpDown control.


You can add event handler to your inner TextBox template. I don't remember, can you add it on template, but I'm sure, that you can create style like this

<Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}">
    <EventSetter Event="ValueChainging" Handler="PathName_KeyDown" />
    <EventSetter Event="LostFocust" Handler="GiveFocusToMe" />
    ....
</Style>

and than apply it to your TextBox, put BreakPoints and see all details you need


I have added LostFocus event to text box that is inside <inputToolkit:ButtonSpinner > </inputToolkit:ButtonSpinner > and there in the event i wrote code to achieve my logic. :)

as follows my TextBox will look like

 <TextBox x:Name="Text"  Style="{StaticResource TextBoxStyle}" TabIndex="{TemplateBinding TabIndex}"
                                     BorderThickness="0" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" MinWidth="50" Width="Auto"  AcceptsReturn="False" Text="{TemplateBinding Value}" TextAlignment="Right" TextWrapping="NoWrap" LostFocus="Text_LostFocus"/>


Your inputToolkit:ButtonSpinner control has a name in the Template i.e. Spinner

So using that you can get the control as below (only after the Visual Tree is fully formed such as after Load event)...

 var mySpinner = myNumericUpDownControl.Template.FindName("Spinner", myNumericUpDownControl)

your myNumericUpDownControl can be directly named as myNumericUpDownControl in XAML or you can have an attached behavior to extract the spinner control out of it. Whatever decision you take, make sure you do that after VisualTree is fully formed otherwise FindName will fail.

Let me know if this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜