どうしてもうまくうごかなかったので再質問になります
結局何も解決していなかったってことでしょうか?
「今nananananana77さんの手元でどうなっているかが予想がつかないです。」というのは、「(実装しやすいように)できるだけそちらのコードに合わせたいが、提示コードが一部過ぎて再現できない」という意味です。
大した量でないなら、最初から全部出してください。
コレをmainwindowにあるボタンから発火させたい
「ボタンを押すとアニメーションする」ということはわかりますが、どうやって止めるつもりでしょうか?
前回の回答で「ボタンで発火するってことは期間があるようなアニメーションなんでしょうか?」と聞いたのは、その点が不明だったためです。
今回Storyboard
の中身が判明しましたが、Forever
では止まりませんね?
回答者があれこれ聞いてくるのは、要件があいまいだったりXY問題でないかと考えてのことです。
XY問題 - Wikipedia
4パターンありますが、それぞれのボタンを同時に使うとおかしくなります(どれかひとつを採用すると考えてください)
xml
1<Window
2 x:Class="Questions374216.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Questions374216"
6 Width="800"
7 Height="450">
8 <DockPanel>
9 <UniformGrid DockPanel.Dock="Top" Rows="1">
10 <Button Click="Button_Click" Content="RaiseAaaEvent" />
11 <Button Click="Button_Click1" Content="BeginStoryboard" />
12 <ToggleButton Content="IsAnimating" IsChecked="{Binding IsAnimating, ElementName=userControl1}" />
13 <ToggleButton Content="IsEnabled" IsChecked="{Binding IsEnabled, ElementName=userControl1}" />
14 </UniformGrid>
15 <local:UserControl1 x:Name="userControl1" />
16 </DockPanel>
17</Window>
cs
1using System.Windows;
2
3namespace Questions374216
4{
5 public partial class MainWindow : Window
6 {
7 public MainWindow() => InitializeComponent();
8
9
10 // できはするがまどろっこしいだけで何のメリットも感じない
11 private void Button_Click(object sender, RoutedEventArgs e)
12 => userControl1.RaiseEvent(new RoutedEventArgs(UserControl1.AaaEvent));
13
14 // 直接Beginすりゃいい話
15 private void Button_Click1(object sender, RoutedEventArgs e)
16 => userControl1.BeginStoryboard();
17 }
18}
xml
1<UserControl
2 x:Class="Questions374216.UserControl1"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Questions374216">
6 <UserControl.Resources>
7 <Storyboard x:Key="storyboard">
8 <DoubleAnimationUsingKeyFrames
9 RepeatBehavior="Forever"
10 Storyboard.TargetProperty="(Canvas.Left)"
11 Duration="0:0:2.2">
12 <DiscreteDoubleKeyFrame KeyTime="0:0:0.0" Value="0" />
13 <DiscreteDoubleKeyFrame KeyTime="0:0:0.1" Value="-256" />
14 <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="-512" />
15 <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="-768" />
16 <DiscreteDoubleKeyFrame KeyTime="0:0:0.6" Value="-1024" />
17 <DiscreteDoubleKeyFrame KeyTime="0:0:0.7" Value="-1280" />
18 </DoubleAnimationUsingKeyFrames>
19 </Storyboard>
20 </UserControl.Resources>
21 <UserControl.Triggers>
22 <EventTrigger RoutedEvent="local:UserControl1.Aaa">
23 <BeginStoryboard>
24 <Storyboard>
25 <DoubleAnimationUsingKeyFrames
26 RepeatBehavior="Forever"
27 Storyboard.TargetName="aaaa"
28 Storyboard.TargetProperty="(Canvas.Left)"
29 Duration="0:0:2.2">
30 <DiscreteDoubleKeyFrame KeyTime="0:0:0.0" Value="0" />
31 <DiscreteDoubleKeyFrame KeyTime="0:0:0.1" Value="-256" />
32 <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="-512" />
33 <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="-768" />
34 <DiscreteDoubleKeyFrame KeyTime="0:0:0.6" Value="-1024" />
35 <DiscreteDoubleKeyFrame KeyTime="0:0:0.7" Value="-1280" />
36 </DoubleAnimationUsingKeyFrames>
37 </Storyboard>
38 </BeginStoryboard>
39 </EventTrigger>
40 </UserControl.Triggers>
41 <Canvas x:Name="LayoutRoot">
42 <Canvas>
43 <Canvas.Clip>
44 <RectangleGeometry Rect="0,0,256,256" />
45 </Canvas.Clip>
46 <Image Name="aaaa" Source="/aaaaaa.png" />
47 </Canvas>
48 </Canvas>
49</UserControl>
cs
1using System.Windows;
2using System.Windows.Controls;
3using System.Windows.Media.Animation;
4
5namespace Questions374216
6{
7 public partial class UserControl1 : UserControl
8 {
9 public event RoutedEventHandler Aaa { add { AddHandler(AaaEvent, value); } remove { RemoveHandler(AaaEvent, value); } }
10 public static readonly RoutedEvent AaaEvent
11 = EventManager.RegisterRoutedEvent(nameof(Aaa), RoutingStrategy.Bubble,
12 typeof(RoutedEventHandler), typeof(UserControl1));
13
14 public bool IsAnimating { get => (bool)GetValue(IsAnimatingProperty); set => SetValue(IsAnimatingProperty, value); }
15 public static readonly DependencyProperty IsAnimatingProperty
16 = DependencyProperty.Register(nameof(IsAnimating), typeof(bool), typeof(UserControl1),
17 new FrameworkPropertyMetadata(false, (d, e) => ((UserControl1)d).OnIsAnimatingChanged()));
18
19
20 private readonly Storyboard sb;
21
22 public UserControl1()
23 {
24 InitializeComponent();
25
26 sb = (Storyboard)FindResource("storyboard");
27
28 IsEnabled = false;
29 IsEnabledChanged += UserControl1_IsEnabledChanged;
30 }
31
32
33 // 直接Beginすりゃいい話
34 public void BeginStoryboard() => sb.Begin(aaaa, true);
35
36 // 状態があるならそれこそboolでON・OFFできたほうが使いやすいと思うが
37 private void OnIsAnimatingChanged()
38 {
39 if (IsAnimating) sb.Begin(aaaa, true);
40 else sb.Stop(aaaa);
41 }
42
43 // DependencyPropertyを作るのが面倒なら、なにか借用してもいいか?^^;
44 private void UserControl1_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
45 {
46 if (IsEnabled) sb.Begin(aaaa, true);
47 else sb.Stop(aaaa);
48 }
49 }
50}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/17 17:00