2010-02-03 105 views
1

我正面临着为此问题寻找解决方案的难题。我有一个控制模板,其中我有一个内容展示者和一个自定义视觉状态管理器,其视觉状态为Selected和UnSelected,属于SelectionStates组。在内容展示者的内容模板中,我有一个椭圆,其填充属性需要根据视觉状态进行动画处理。这不是直接可能的,因为椭圆位于内容展示者的内容模板中。是否有任何间接的解决方法可以做到这一点。下面是我的模板如何从外部模板中控制模板内的元素

<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> 

回答

0

也许你有一个原因,你以这种方式使用ContentPresenter。内容展示者的正常使用将充当绑定到控件属性的内容的占位符。您通常不会使用ContentPresenter,然后为其提供您自己的DataTemplate。这是我的XAML中的版本没有apparrently不必要的内容演示: -

<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能够找到的椭圆。

+0

嗨安东尼你做的是我的xaml文件的早期版本。在这种情况下,我需要内容主持人。我的应用程序的用户将能够覆盖我的模板(椭圆)并设置自己的对象而不是它。我可以像一样使用 – Vinod 2010-02-03 13:44:32