Arnab Das
Arnab Das

Reputation: 3728

Traversing A Control Template in Silverlight

I've a control template like this

    <ControlTemplate TargetType="Button">
  <Grid >
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">

        <VisualStateGroup.Transitions>

          <!--Take one half second to trasition to the MouseOver state.-->
          <VisualTransition To="MouseOver" 
                              GeneratedDuration="0:0:0.5"/>
        </VisualStateGroup.Transitions>

        <VisualState x:Name="Normal" />

        <!--Change the SolidColorBrush, ButtonBrush, to red when the
            mouse is over the button.-->
        <VisualState x:Name="MouseOver">
          <Storyboard>
            <ColorAnimation Storyboard.TargetName="ButtonBrush" 
                            Storyboard.TargetProperty="Color" To="Red" />
          </Storyboard>
        </VisualState>
        **<VisualState x:Name="SelectedButton">
          <Storyboard x:Name="SelectedButtonStoryboard">
            <ColorAnimation Storyboard.TargetName="ButtonBrush" 
                            Storyboard.TargetProperty="Color" To="Red" />
          </Storyboard>
        </VisualState>**
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Grid.Background>
      <SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
    </Grid.Background>
  </Grid>
</ControlTemplate>

I've to traverse this control template to get the storyboard named SelectedButtonStoryboard or get the visual state SelectedButton and to invoke the either one.

Please help. Thanks in advance.

Upvotes: 0

Views: 271

Answers (2)

iCollect.it Ltd
iCollect.it Ltd

Reputation: 93631

You can't name elements in a control template as there is no matching designer code-behind generated. Naming of elements works by a runtime search for names in the visual tree, and assigning member objects to them, during the InitializeObject call in a user control.

The elements in a template are effectively added to the visual tree at runtime only.

You can however use VisualTreeHelper to iterate the visual tree looking for specific element types (in your case the Storyboard objects).

Upvotes: 1

Oliver
Oliver

Reputation: 36453

It sounds like you should rather change the visualstate based on your example xaml.

VisualStateManager.GoToState(this, "SelectedButton", true);

Or this is you only have a reference to the control using the ControlTemplate

VisualStateManager.GoToState(controlInstance, "SelectedButton", true);

Upvotes: 1

Related Questions