3

パラメータの 1 つとしてデリゲートを取るメソッドを作成しようとしていますが、機能しません。私は何を間違っていますか?がある行で「コールバックは変数ですが、メソッドのように使用されます」というエラーが表示されますwindowAnimation.Completed += new EventHandler(callback)

private void animateWindowWidth(Window window, double width, double duration, Delegate callback)
{
    window.BeginInit();
    window.Dispatcher.BeginInvoke(new Action(() =>
    {
        DoubleAnimation windowAnimation = new DoubleAnimation();
        windowAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
        windowAnimation.From = window.Width;
        windowAnimation.To = width;
        windowAnimation.FillBehavior = FillBehavior.HoldEnd;
        windowAnimation.Completed += new EventHandler(callback);
        window.BeginAnimation(Window.WidthProperty, windowAnimation);
    }), null);
    window.EndInit();
}
4

3 に答える 3

2

Delegateなぜそれだけでは機能しないのかを少し説明したいと思いました。

Delegate真のデリゲートではなく、1つの表現です。これは基本的に、デリゲートを保持する変数です。これが、変数をメソッドのように扱うためにエラーが発生する理由です。

簡単な例(おそらくこれを行うことはないでしょう)は、追加を行う2人の代理人がいる場合です。1つはintを使用し、もう1つはfloatを使用します。デリゲートをオブジェクトに格納し、それを1つの変数Delegateを呼び出す別の関数に渡すことができます。DynamicInvoke()

    void MyMethod(Delegate d)
    {
        d.DynamicInvoke(leftHandSide, rightHandSide);
    }

2つのデリゲートのどちらがDelegateオブジェクトに格納されていても、適切な機能を利用できます。

あなたの場合、windowAnimation.CompletedはEventHandlerなどの実際のデリゲートメソッドを期待しています。さらに、EventHandlerのコンストラクターは、デリゲートメソッドを想定しています。したがってDelegate、どちらの状況でもオブジェクトを使用しても機能しません。

デリゲートでラップするか、ラムダ関数を使用して真のメソッド呼び出しを行う必要があります

windowAnimation.Completed += (s,e) => callback.DynamicInvoke();

または、このメソッドを呼び出すときに、に変更callbackして新しいメソッドを作成します。EventHandler

于 2012-12-28T06:01:36.223 に答える
0

Actionこの文字列の代わりに使用して置き換えてみてくださいDelegate

windowAnimation.Completed += new EventHandler(callback);

これとともに:

windowAnimation.Completed += (s, e) => callback();

したがって、最終的には次のようになります。

private void animateWindowWidth(Window window, double width, double duration, Action callback)
{
    window.BeginInit();
    window.Dispatcher.BeginInvoke(new Action(() =>
    {
        DoubleAnimation windowAnimation = new DoubleAnimation();
        windowAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
        windowAnimation.From = window.Width;
        windowAnimation.To = width;
        windowAnimation.FillBehavior = FillBehavior.HoldEnd;
        windowAnimation.Completed += (s, e) => callback());
        window.BeginAnimation(Window.WidthProperty, windowAnimation);
    }), null);
    window.EndInit();
}
于 2012-12-28T04:48:40.077 に答える
0

メソッドの署名を次のように変更できます。

private void animateWindowWidth(
    Window window, 
    double width, 
    double duration, 
    EventHandler callback)

そして、エラーの原因となったその行

windowAnimation.Completed += callback;

EvenHandler次に、メソッドを呼び出すときに新しいを作成します。

于 2012-12-28T04:26:00.093 に答える