2

重複の可能性: VB.NET のメソッド グループ?

回答を読んでいるときに、次のコードを取得しました。

public static class Helper
{
    public static bool GetAutoScroll(DependencyObject obj)
    {
        return (bool)obj.GetValue(AutoScrollProperty);
    }

    public static void SetAutoScroll(DependencyObject obj, bool value)
    {
        obj.SetValue(AutoScrollProperty, value);
    }

    public static readonly DependencyProperty AutoScrollProperty =
        DependencyProperty.RegisterAttached("AutoScroll", typeof(bool),
        typeof(Helper),
        new PropertyMetadata(false, AutoScrollPropertyChanged));

    private static void AutoScrollPropertyChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var scrollViewer = d as ScrollViewer;

        if (scrollViewer != null && (bool)e.NewValue)
        {
            scrollViewer.ScrollToBottom();
        }
    }
}

私はVB.NETで作業しているので、変換して取得しました:

Public NotInheritable Class Helper

    Private Sub New()
    End Sub

    Public Shared Function GetAutoScroll(ByVal obj As DependencyObject)
    As Boolean
        Return CBool(obj.GetValue(AutoScrollProperty))
    End Function

    Public Shared Sub SetAutoScroll(ByVal obj As DependencyObject,
    ByVal value As Boolean)
        obj.SetValue(AutoScrollProperty, value)
    End Sub

    Public Shared ReadOnly AutoScrollProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("AutoScroll", GetType(Boolean),
        GetType(Helper),
        New PropertyMetadata(False, AutoScrollPropertyChanged)) // Error Here

    Private Shared Sub AutoScrollPropertyChanged(ByVal d As
    System.Windows.DependencyObject, ByVal e As
    System.Windows.DependencyPropertyChangedEventArgs)
        Dim scrollViewer = TryCast(d, ScrollViewer)

        If scrollViewer IsNot Nothing AndAlso CBool(e.NewValue) Then
            scrollViewer.ScrollToBottom()
        End If
    End Sub

End Class

ただし、C# コードはコンパイルされて正常に動作しますが、VB.NET では、コードは次のようなエラー (コードでマーク) を返します。

'Private Shared Sub AutoScrollPropertyChanged (d As System.Windows.DependencyObject, e As System.Windows.DependencyPropertyChangedEventArgs)' のパラメーター 'e' に引数が指定されていません

ここに画像の説明を入力してください

私は何が欠けていますか?PropertyChangedCallbackデリゲートは、オブジェクト ブラウザーで定義されているとおりです。

Public Delegate Sub PropertyChangedCallback(
    ByVal d As System.Windows.DependencyObject, ByVal e As
    System.Windows.DependencyPropertyChangedEventArgs)
4

2 に答える 2

8

C# には、メソッド グループをデリゲート型に変換できる言語機能があります。したがって、代わりに:

private void Foo() {}
private void Bar(Action arg) {}

Bar(new Action(Foo));

あなたは書ける:

Bar(Foo);

私は VB の専門家ではありませんが、VB .NET にはそのような機能がないのではないかと思いますAddressOf演算子が必要なようです:

New PropertyMetadata(False, AddressOf AutoScrollPropertyChanged)
于 2012-10-11T06:15:09.053 に答える
4

私はそれをコンパイルしませんでしたが、AutoScrollPropertyChanged を AddressOf 演算子で参照する必要があると思います。

Public Shared ReadOnly AutoScrollProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("AutoScroll", GetType(Boolean),
        GetType(Helper),
        New PropertyMetadata(False, AddressOf AutoScrollPropertyChanged))
于 2012-10-11T06:17:02.367 に答える