Как я могу получить контроль над элементом внутри шаблона из внешнего шаблона - PullRequest
1 голос
/ 03 февраля 2010

Мне трудно найти решение этой проблемы.У меня есть шаблон элемента управления, в котором у меня есть ведущий контента и пользовательский менеджер визуальных состояний с визуальным состоянием Selected и UnSelected в группе SelectionStates.Внутри шаблона содержимого предъявителя контента у меня есть эллипс, свойство Fill которого я хочу анимировать в соответствии с визуальным состоянием.Это невозможно напрямую, так как эллипс находится внутри шаблона контента предъявителя контента.Можно ли сделать то же самое косвенным способом?Ниже мой шаблон

<Style TargetType="local:TabNavigationItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TabNavigationItem">
                <Grid>
                    <vsm:VisualStateManager.VisualStateGroups>
                        <vsm:VisualStateGroup x:Name="SelectionStates">
                            <vsm:VisualState x:Name="Selected">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabStripEllipse"
                                                   Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="#FF3B5A82"/>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="UnSelected">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabStripEllipse"
                                                   Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="Transparent"/>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                        </vsm:VisualStateGroup>
                    </vsm:VisualStateManager.VisualStateGroups>

                    <ContentPresenter>
   <ContentPresenter.ContentTemplate>
    <DataTemplate x:Key="tabNavigationItemTemplate">
     <Border Padding="1">
      <Ellipse x:Name="TabStripEllipse" 
       Fill="Transparent"
       Stroke="#FF3B5A82" Cursor="Hand" 
       Height="8" Width="8"/>
     </Border>
    </DataTemplate>
   </ContentPresenter.ContentTemplate>
  </ContentPresenter>

 </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ваши мысли и предложения приветствуются ..

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

<Style TargetType="local:TabNavigationItem">
    <Setter Property="ItemContentTemplate" Value="{StaticResource contentTemplate}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TabNavigationItem">
                <Grid>

                    <Border>
                        <ContentPresenter>
                            <ContentPresenter.ContentTemplate>

                                <vsm:VisualStateManager.VisualStateGroups>
                                    <vsm:VisualStateGroup x:Name="SelectionStates">
                                        <vsm:VisualState x:Name="Selected">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabItemPresenter"
                                                               Storyboard.TargetProperty="Background">
                                                    <DiscreteObjectKeyFrame KeyTime="0">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <SolidColorBrush Color="#FF3B5A82"/>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                        <vsm:VisualState x:Name="UnSelected">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabItemPresenter"
                                                               Storyboard.TargetProperty="Background">
                                                    <DiscreteObjectKeyFrame KeyTime="0">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <SolidColorBrush Color="Transparent"/>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                </vsm:VisualStateManager.VisualStateGroups>

                                <Border Padding="1">
                                    <Ellipse x:Name="TabStripEllipse" 
                                        Fill="Transparent"
                                        Stroke="#FF3B5A82" Cursor="Hand" 
                                        Height="8" Width="8"/>
                                </Border>

                            </ContentPresenter.ContentTemplate>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 Ответ

0 голосов
/ 03 февраля 2010

Возможно, у вас есть причина, по которой вы используете ContentPresenter таким образом. Обычное использование предъявителя контента будет выполнять роль заполнителя для контента, связанного со свойством элемента управления. Обычно вы не используете ContentPresenter, а затем предоставляете ему свой собственный DataTemplate. Вот моя версия вашего Xaml без явно ненужного предъявителя контента: -

<Style TargetType="local:TabNavigationItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TabNavigationItem">
                <Grid>
                    <vsm:VisualStateManager.VisualStateGroups>
                        <vsm:VisualStateGroup x:Name="SelectionStates">
                            <vsm:VisualState x:Name="Selected">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabStripEllipse"
                                                   Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="#FF3B5A82"/>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="UnSelected">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TabStripEllipse"
                                                   Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <SolidColorBrush Color="Transparent"/>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                        </vsm:VisualStateGroup>
                    </vsm:VisualStateManager.VisualStateGroups>    
     <Border Padding="1">
      <Ellipse x:Name="TabStripEllipse" 
       Fill="Transparent"
       Stroke="#FF3B5A82" Cursor="Hand" 
       Height="8" Width="8"/>
     </Border>    
 </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь ваш VSM должен найти Эллипс.

...