2010-02-03 3 views
1

이 문제에 대한 해결책을 찾는 데 어려움을 겪고 있습니다. 나는 콘텐트 프리젠터와 SelectionStates 그룹 아래에서 시각적 상태 Selected와 UnSelected를 가진 사용자 지정 Visual State Manager를 가진 컨트롤 템플릿을 가지고있다. 콘텐츠 발표자의 콘텐츠 템플릿 안에는 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> 

답변

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

안녕하세요 anthony 내 xaml 파일의 이전 버전입니다. 이 경우 콘텐츠 발표자가 필요합니다. 내 응용 프로그램 사용자는 내 템플릿 (타원)을 무시하고 대신 자신의 개체를 설정할 수 있습니다. 처럼 사용할 수 있습니다. – Vinod

관련 문제