none
VB.net VisualTreeHelperの拡張メソッドについて RRS feed

  • 質問

  • 毎々、お世話になっております。

    WPFでVisualTreeHelperの機能が不足していたため、拡張メソッドを追加して使用したいのですが
    インテリセンスには表示されるのですが、いざ使おうとするとエラーになってしまいます。
    「非共有メンバを参照するには、オブジェクト参照が必要です。」

    VisualTreeHelperの定義を見たところ
    NotInheritableキーワードがついていてメンバのメソッドがSharedになっているのですが
    この場合、拡張メソッドを追加することができないのでしょうか?
    初歩的な質問かもしれませんが、ご教授いただけますでしょうか?

    Imports System.Windows.Interactivity
    
        ''' <summary>
        ''' サンプルAction
        ''' </summary>
        Public Class SampleAction : Inherits TriggerAction(Of DependencyObject)
            Protected Overrides Sub Invoke(parameter As Object)
                Dim x = VisualTreeHelper.GetParentEx(AssociatedObject, GetType(Window))
            End Sub
        End Class
    
    Imports System.Runtime.CompilerServices
    
    ''' <summary>
    ''' VisualTreeHelperの拡張のメソッド
    ''' </summary>
    Module VisualTreeHelperExtensions
    
        ''' <summary>
        ''' ビジュアルオブジェクトの指定された型の親を探す
        ''' </summary>
        ''' <param name="this">拡張対象の型</param>
        ''' <param name="reference">親が返されるビジュアル</param>
        ''' <param name="targetType">対象型</param>
        ''' <returns></returns>
        <Extension>
        Public Function GetParentEx(ByVal this As VisualTreeHelper, ByVal reference As DependencyObject, ByVal targetType As Type) As DependencyObject
            Dim parent = VisualTreeHelper.GetParent(reference)
            If IsNothing(parent) OrElse parent.GetType.BaseType Is targetType Then
                Return parent
            Else
                Return GetParentEx(this, reference, targetType)
            End If
        End Function
    End Module
    

    ----------------------------------------
    [環境]
    VisualStudio 2015 Community
    WPF(VB.net)
    .Net Framework4.6.00081
    Windows7 Pro x64 SP1

    2016年1月20日 10:36

回答

  • こんにちは。

    拡張メソッドは静的メソッドを、拡張によってインスタンスメソッドのように扱えるようにする機能で
    拡張元のインスタンスが必要となります。(thisでVisualTreeHelperインスタンスを渡すことは出来ない)

    なので、拡張メソッドの追加は出来ないと思います。

    • 回答としてマーク mikupedia 2016年1月20日 11:17
    2016年1月20日 10:48
    モデレータ

すべての返信