質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1413閲覧

mainフォームからusercontrolのイベント発火方法

nananananana77

総合スコア2

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/12/16 16:05

前回質問した内容を試してみたのですがどうしてもうまくうごかなかったので再質問になります
usercontrolに以下のコードを設定しました

C#

1 <Canvas x:Name="LayoutRoot"> 2 <Canvas Canvas.Left="0" Canvas.Top="0"> 3 <Canvas.Clip> 4 <RectangleGeometry Rect="0,0,256,256"/> 5 </Canvas.Clip> 6 <Image Name="Switching" Source="../images/aaaaaa.png" Stretch="None"/> 7 </Canvas> 8 <Canvas.Triggers> 9 <EventTrigger RoutedEvent="??????"> 10 <BeginStoryboard> 11 <Storyboard> 12 <DoubleAnimationUsingKeyFrames Storyboard.TargetName="aaaa" Storyboard.TargetProperty="(Canvas.Left)" 13 Duration="0:0:2.2" RepeatBehavior="Forever"> 14 <DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0.0"/> 15 <DiscreteDoubleKeyFrame Value="-256" KeyTime="0:0:0.1"/> 16 <DiscreteDoubleKeyFrame Value="-512" KeyTime="0:0:0.3"/> 17 <DiscreteDoubleKeyFrame Value="-768" KeyTime="0:0:0.5"/> 18 <DiscreteDoubleKeyFrame Value="-1024" KeyTime="0:0:0.6"/> 19 <DiscreteDoubleKeyFrame Value="-1280" KeyTime="0:0:0.7"/> 20 </DoubleAnimationUsingKeyFrames> 21 </Storyboard> 22 </BeginStoryboard> 23 </EventTrigger> 24 </Canvas.Triggers> 25 </Canvas>

コレをmainwindowにあるボタンから発火させたいのですがroutedeventに設定すればいいのかeventの呼び出し方が他にあるのか見当がつかない状況です。よろしくお願いいたします

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どうしてもうまくうごかなかったので再質問になります

結局何も解決していなかったってことでしょうか?

「今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/16 21:29

編集2023/07/29 12:39
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nananananana77

2021/12/17 17:00

度々申し訳ないです 無事動きました以後気をつけたいと思いますありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問