3

Silverlight には 3 つの UserControls があります。

UCOutside には、UCInside1 と UCInside2 という 2 つの UserControls が含まれています。

UserControl を含む

<!-- UCOutside --> 
<UserControl.Resources>
    <Storyboard x:Name="OutsideBoard">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="LayoutRoot">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="45"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl.Resources>

<Grid x:Name="LayoutRoot">
    <Grid.Projection>
        <PlaneProjection/>
    </Grid.Projection>
    <local:UCInside1 Margin="39,35,266,173"/>
    <local:UCInside2 HorizontalAlignment="Right" Margin="0,234,26,30" />
</Grid>

内部の最初の UserControl

<!-- UCInside1 -->
<UserControl.Resources>
    <Storyboard x:Name="ImageFade">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="myImage">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="0.2"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Image x:Name="myImage" Margin="0" Source="/OtherImage.png" Stretch="Fill" Width="312" Height="250" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

2 番目の UserControl 内部

<!-- UCInside2 -->
<UserControl.Resources>
    <Storyboard x:Name="ButtonFade">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="image1">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" HorizontalAlignment="Left" Height="195" VerticalAlignment="Top" Width="218">
    <Button Content="Button" HorizontalAlignment="Right" Margin="0,0,25,51" VerticalAlignment="Bottom" Width="75" Click="ClickButton"/>
    <Image x:Name="image1" HorizontalAlignment="Left" Margin="41,32,0,70" Source="/Whatever.png" Stretch="Fill" Width="47"/>
</Grid>

ボタンの ClickButton イベントに気付くでしょう。また、すべての UserControls で指定された単純な Storyboards があることにも気付くでしょう。

問題は、3 つのアニメーションすべてをクリック イベントで開始するにはどうすればよいかということです。XAML または Blend を使用してすべてを結び付けることができますか? そうでない場合、C#コードでどのように行われますか?

4

2 に答える 2

1

この問題を解決するための非常にシンプルで効率的な方法は、Observer-Pattern を使用するために INotifyPropertyChanged インターフェイスを使用することです。

初期イベントを発生させるコンテナを監視可能な部分とし、他の 2 つのコンテナにそれを監視させます。そのため、監視可能なコンテナーが何かを行う (たとえば、クリック イベントを発生させる) たびに、他のコンテナーは通知を受け、それに応じて反応することができます。

OutsideContainer クラスが監視可能になったら、次の 2 つの手順を実行します。

  1. OutsideButton クラスで、適切な場所 (たとえば、「スーパー」クリックが発生した場所) で PropertyChanged イベントを発生させます。

  2. ImageFade および ButtonFace クラスで、PropertyChanged イベントをチャットし、何かを実行します (たとえば、独自のクリック イベントを発生させます)。

次のことを試してください。

コード ビハインド ファイル OutsideBoard.cs で、監視可能にするために INotifyPropertyChanged インターフェイスを実装します。

class OutsideBoard : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyChanged (string property) {

        if (PropertyChanged != null) {

            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    // the click- EventHandler of your UserControl
    public event Click_EventHandler (object sender, RoutedEventArgs e) {

        // your clicking code of your UserControl

        FirePropertyChanged("SuperClick");
    }


    // rest of the code inhere ...
}

ここで、OutsideBorder クラスを監視するすべてのクラスは、そのクラスに EventHandler を実装する必要があります。

ButtonFade および ImageFade クラスに次のように記述します。

outsideBorder.PropertyChanged += PropertyEventChangeHandler(MyClickHandling);

public void MyClickHandling (object sender, PropertyChangeEventArgs e) {

     // do something
}

したがって、OutsideBoard クラスが PropertyChanged イベントを発生させるたびに、すべてのオブザーバーは MyClickHandling メソッドを呼び出して通知を受け取ります。

それがあなたを助けることを願っています。

于 2011-10-21T11:35:07.930 に答える
0

もう一度やり直した後、もっと簡単な解決策があるかもしれないことがわかりました:)

OutsideBoard クラスで別のクラスのクリックイベントに反応したい場合は、その特定のイベントをキャッチするだけです:)

そのため、「子」のコード ビハインドでは、単に次のように記述します (OutsideBorder クラスがoutsideBorderであると仮定すると:

outsideBorder.Click += MouseEventHandler(MyClickHandler);

public void MyClickHandler (object sender, MouseEventArgs e) {

    // do something to react on the click appeared in the OutsideBoard class.
}

したがって、OutsideBoard のクリック イベントは、それ自体から (干渉なしで) チャットされます。そのクリック発火コントロールに追加の EventHandler を追加するだけです :)

于 2011-10-21T11:42:33.287 に答える