2014-12-13 22 views
0

我想隱藏基於頁面視覺狀態的TextBlock。我使用VisualStateManager來改變狀態,工作正常。但我的代碼隱藏TextBlock不知何故不。 附加問題:如果兩個狀態共享相同的指令(如Narrow和Snapped),有沒有辦法再次編寫相同的ObjectAnimationUsingKeyFrames標籤,那麼維護的代碼量就會減少?謝謝如何用VisualStateManager隱藏XAML TextBlock?

<TextBlock x:Name="Title" FontSize="20" FontWeight="SemiLight" Margin="12,0,0,1" 
            Text="{Binding TitleTextBlockText}" VerticalAlignment="Center"> 
          <VisualStateManager.VisualStateGroups> 
           <!-- Visual states reflect the application's window size --> 
           <VisualStateGroup> 
            <VisualState x:Name="DefaultLayout"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Visible 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Normal"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Visible 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="FullScreenLandscape"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Visible 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="FullScreenPortrait"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Visible 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Filled"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Visible 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 

            <VisualState x:Name="Snapped"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Collapsed 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="Narrow"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                      Storyboard.TargetName="Title"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 Visibility.Collapsed 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
         </TextBlock> 

回答

0

如果你想這樣做(例如在自定義控件的模板中),你應該將textbloc包裝成網格。你不能像這樣激活一個對象,因爲visualstatemanager不能在由visualstatemanager本身動畫的對象內部。 在控件的通用模板中,如下所示:

<ControlTemplate TargetType="{x:Type local:NumericField}"> 
      <Grid> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup Name="ValidationStates"> 
       <VisualState Name="Good"> 
        <!-- do your things --> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 

      <Border x:Name="ValidationBorderPart" 
        BorderBrush="Black" 
        BorderThickness="1"> 
       <TextBox x:Name="ValuePart" 
         Foreground="Black" 
         BorderBrush="Transparent" 
         BorderThickness="0" 
         Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:NumericField}},Path=Representation, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
      </Border> 

      </Grid> 
     </ControlTemplate>