none
隠しておいたコントロールを表示させたときにアニメーションさせるには RRS feed

  • 質問

  • お世話になっております。

    標題を実現するために、下記のように書こうとしているのですが、"???"のところがわかりません。

    必要に応じて表示/非表示を切り替えたいので、Loadedイベントではないですよね。

    コードビハインドで書くしかないのでしょうか?

    <TextBlock Name="uiTextBlock" Visibility="Collapsed">
    	<TextBlock.LayoutTransform>
    		<RotateTransform x:Name="Rotate"/>
    	</TextBlock.LayoutTransform>
    
    	<TextBlock.Triggers>
    		<EventTrigger RoutedEvent="???" SourceName="uiTextBlock">
    			<BeginStoryboard>
    				<Storyboard RepeatBehavior="Forever">
    					<DoubleAnimation BeginTime="00:00:00" Duration="0:0:10"
    						Storyboard.TargetName="Rotate" Storyboard.TargetProperty="Angle" From="0" To="360">
    					</DoubleAnimation>
    				</Storyboard>
    			</BeginStoryboard>
    		</EventTrigger>
    	</TextBlock.Triggers>
    </TextBlock>
    
    

    教えてください。よろしくお願いします。

     

     

     

     

    2010年7月19日 5:24

回答

  • <Trigger Property="IsVisible" Value="true">
    これじゃまずいんですね。うーん勉強になった。

    IsVisible は、スタイル トリガとして使用するためのものではありません。IsVisible をスタイル トリガとして使用すると、予期しない結果が生じる可能性があります。IsVisible は、低レベルの入力実装による状態チェック用です。
    http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.isvisible(v=VS.80).aspx

    IsEnabled

    を使ったらどうでしょうか?
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク Yo48 2010年8月24日 9:36
    2010年7月22日 4:15

すべての返信

  • 上記コードの ??? のところに Loaded を指定すると、表示している間は回り続けますが、実現したい動作はそれではなく別の動作なのでしょうか?


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 編集済み なかむら 2010年7月19日 8:06 動産→動作
    2010年7月19日 8:05
  • Loadedでは、途中で非表示(Visibility= Visibility.Hidden)にしたとしてもアニメーションは動いていて、

    多少なりとも負荷になるのでは?と心配したのですが。

    Hiddenにすれば、アニメーションのシーケンスも止まっていると考えていいのでしょうか? 

     

    2010年7月19日 9:16
  • Style.Triggers で、Visibility=Visible の Trigger を使って EnterActions に BeginStoryboard を記述するとか。
    2010年7月19日 11:18
  • <Trigger Property="IsVisible" Value="true">
    これじゃまずいんですね。うーん勉強になった。

    IsVisible は、スタイル トリガとして使用するためのものではありません。IsVisible をスタイル トリガとして使用すると、予期しない結果が生じる可能性があります。IsVisible は、低レベルの入力実装による状態チェック用です。
    http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.isvisible(v=VS.80).aspx

    IsEnabled

    を使ったらどうでしょうか?
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク Yo48 2010年8月24日 9:36
    2010年7月22日 4:15
  • 皆様

    いろいろなアドバイスありがとうございます。

    週末に取り組んで、結果を報告できればと思っています。

    取り急ぎお礼まで。

    2010年7月22日 12:37
  • えムナウ様

    IsEnabledで実現できました。ありがとうございました。

    XAML+C#のコードをアップしておきます。

    <!-- XAML -->

    	<Window.Resources>
    		<Style x:Key="LabelStyleRotate" TargetType="{x:Type Label}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type Label}">
    						<Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
    							<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True">
    								<ContentPresenter.LayoutTransform>
    									<RotateTransform x:Name="Rotate"/>
    								</ContentPresenter.LayoutTransform>
    							</ContentPresenter>
    						</Border>
    						<ControlTemplate.Triggers>
    							<Trigger Property="IsEnabled" Value="true">
    								<Trigger.EnterActions>
    									<BeginStoryboard>
    										<Storyboard RepeatBehavior="Forever">
    											<DoubleAnimation BeginTime="00:00:00" Duration="0:0:10"
    											Storyboard.TargetName="Rotate" Storyboard.TargetProperty="Angle" From="0" To="360">
    											</DoubleAnimation>
    										</Storyboard>
    									</BeginStoryboard>
    								</Trigger.EnterActions>
    							</Trigger>
    						</ControlTemplate.Triggers>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
    	</Window.Resources>
    
    	<Grid x:Name="LayoutRoot">
    		<StackPanel>
    			<Button Margin="5" Width="80" Click="OnShowButtonClicked">Show</Button>
    			<Grid Margin="5" Width="300" Height="300">
    				<Label Name="uiLabel" Content="ABC" IsEnabled="False" Visibility="Hidden" HorizontalAlignment="Center" VerticalAlignment="Center" Style="{DynamicResource LabelStyleRotate}" FontSize="96"/>
    			</Grid>
    		</StackPanel>
    	</Grid>
    
    

    //C#

    	public partial class MainWindow : Window
    	{
    		private void OnShowButtonClicked(object sender, RoutedEventArgs e)
    		{
    			uiLabel.Visibility= Visibility.Visible;
    			uiLabel.IsEnabled= true;
    		}
    	}
    
    

     

    Label のTemplateの書き方がわからず、はじめてBlendを使いました。

    しかし、Blendで回転のアニメーションを付ける手順がわからず、

    Blendで出力したコードに、手書きで編集・追加しました。

     

     

     

     

    2010年8月24日 9:49