none
Steuerung von Animationen ausschließlich per Tastatur - Wie? RRS feed

  • Frage

  • Hallo, ich würde gerne meine Applikation ohne Maus steuern. Dazu sehe ich zwei Möglichkeiten:

    1) Tastaturevent KeyDown im Codebehind abfangen, auswerten und die XAML-Storyboards triggern. Nur wie trigger ich ein in XAML definiertes Storyboard vom C# aus?

    2) Abfrage der einzelnen Tasten direkt im XAML - Wie ginge das? Mit KeyBinding und Commands? Oder auch einfacher?

     

    Vielen Dank im Voraus,

     

    O.

    Samstag, 18. September 2010 14:59

Antworten

  • Hallo Ortwin,

    vielfältige Möglichkeiten.. . Vielleicht am saubersten, an Command's binden und den Execute-Handler entsprechend ausführen.

    Über C# direkt
    etwa:

      Storyboard myStoryboard = (Storyboard)this.Resources["Storyboard1"];
      myStoryboard.Begin(this); 
    

    oder auch C# mit PreviewKeyDown:

      void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e) 
      { 
        if (e.Key != Key.Right && e.Key != Key.Left) return; 
        var re = new RoutedEventArgs(Button.ClickEvent); 
        if (e.Key != Key.Right) btnPlay1.RaiseEvent(re); 
        if (e.Key != Key.Left) btnPlay2.RaiseEvent(re); 
      }
      public MainWindow()
      {
        this.InitializeComponent();
        PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
      }

    ______________

    Über XAML ohne Code-Behind
    hier ein Beispiel (man muss dann [Alt-1] oder [Alt-2] drücken) :
    intern über [Mnemonic] / [ProcessMnemonic]

    <Window
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	x:Class="WpfStoryboardDemo.MainWindow"
    	x:Name="Window"
    	Title="MainWindow"
    	Width="640" Height="480" >
     <Window.Resources>
     <Storyboard x:Key="Storyboard1">
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty=
    			"(FrameworkElement.HorizontalAlignment)" Storyboard.TargetName="button">
      <DiscreteObjectKeyFrame KeyTime="0" Value=
    				"{x:Static HorizontalAlignment.Center}"/>
      </ObjectAnimationUsingKeyFrames>
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty=
    			"(FrameworkElement.VerticalAlignment)" Storyboard.TargetName="button">
      <DiscreteObjectKeyFrame KeyTime="0" Value=
    				"{x:Static VerticalAlignment.Center}"/>
      </ObjectAnimationUsingKeyFrames>
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=
    			"(UIElement.RenderTransform).(TransformGroup.Children)[0].
    			(ScaleTransform.ScaleX)" Storyboard.TargetName="button">
      <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="3.627"/>
      </DoubleAnimationUsingKeyFrames>
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="
    			(UIElement.RenderTransform).(TransformGroup.Children)[3].
    			(TranslateTransform.X)" Storyboard.TargetName="button">
      <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="19.5"/>
      </DoubleAnimationUsingKeyFrames>
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="
    			(UIElement.RenderTransform).(TransformGroup.Children)[0].
    			(ScaleTransform.ScaleY)" Storyboard.TargetName="button">
      <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="3.732"/>
      </DoubleAnimationUsingKeyFrames>
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="
    			(UIElement.RenderTransform).(TransformGroup.Children)[3].
    			(TranslateTransform.Y)" Storyboard.TargetName="button">
      <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-20"/>
      </DoubleAnimationUsingKeyFrames>
     </Storyboard>
     </Window.Resources>
    
     <Grid x:Name="LayoutRoot">
     <Button x:Name="button" Content="Button" 
    		HorizontalAlignment="Center" VerticalAlignment="Center" 
     Width="75" RenderTransformOrigin="0.5,0.5">
      <Button.RenderTransform>
      <TransformGroup>
       <ScaleTransform/>
       <SkewTransform/>
       <RotateTransform/>
       <TranslateTransform/>
      </TransformGroup>
      </Button.RenderTransform>
     </Button>
     <DockPanel LastChildFill="false" Width="300"
      Name="dockPanel1" Margin="20,200,20,20" 
      HorizontalAlignment="Center" VerticalAlignment="Center">
      <Button DockPanel.Dock="Left"
      Content="Play_1" Height="23" Name="btnPlay1" Width="75">
      <Button.Triggers>
       <EventTrigger RoutedEvent="Button.Click">
       <BeginStoryboard Storyboard="{StaticResource Storyboard1}" />
       </EventTrigger>
      </Button.Triggers>
      </Button>
      <Button 
      DockPanel.Dock="Right" Content="Play_2" Height="23"
      Name="btnPlay2" Width="75">
      <Button.Triggers>
       <EventTrigger RoutedEvent="Button.Click">
       <BeginStoryboard Storyboard="{StaticResource Storyboard1}" />
       </EventTrigger>
      </Button.Triggers>
      </Button>
     </DockPanel>
     </Grid>
    </Window>


    An den btnPlay1 vielleicht ein anderes Storyboard binden.
    __________________________

    Allgemeine Infos dazu noch:

    [Erstellen, Ändern oder Löschen eines Storyboards]
    http://msdn.microsoft.com/de-de/library/cc295300(Expression.40).aspx

    [Steuern des Startzeitpunkts eines Storyboards]
    http://msdn.microsoft.com/de-de/library/cc295328(Expression.40).aspx

    [ControlStoryboardAction]
    http://msdn.microsoft.com/de-de/library/ff723988(Expression.40).aspx


    ciao Frank
    Sonntag, 19. September 2010 10:11