2

C#でWinFormsのカスタムコントロールを作成しました。そのプロパティの1つは、ある時点で再生されるオーディオストリームです。このプロパティは、プロパティなどを使用してリソースマニフェスト(具体的にはオーディオリソース)から選択する必要があることをVSに伝える方法はありますか?

定義されたプロパティ。

コメントされたプロパティはオーディオストリームです。

プロパティを制御します。

これは、WinFormsデザイナに表示される方法です。

バイナリデータエディタ。

これは、編集[...]ボタンをクリックしたときに得られるものです。これを[オーディオ]リソースチューザーに置き換えてほしい。

4

2 に答える 2

1

あなたが探しているのは:

[Editor(typeof(MyAudioEditor), typeof(UITypeEditor)]

この属性を使用すると、そのプロパティがプロパティグリッドに表示されるときに使用される特定のエディターを指定できます。

次に、基本タイプから新しいエディターを派生させて作成できます。基本タイプは、System.Drawing.Design.UITypeEditorであるか、System.Drawing.Design.UITypeEditorから派生している必要があります。

ほとんどの場合、Editorが呼び出されると、選択したフォームがポップアップ表示され、その戻り値がプロパティにバインドされます。

UITypeEditorには、4つの仮想メソッドと1つの仮想プロパティがあり、誰かがプロパティを操作したとき、またはプロパティがグリッドにペイントされたときのすべての動作を変更できます。

于 2012-10-29T00:12:45.567 に答える
0

私は自分でそれを行う方法を示す以下のコードを投稿しています。

いくつかの観察:

  • 私のコードでAudioNameは、デザイナーで設定されるStringプロパティを作成しました。このプロパティは、アセンブリ内のリソース名を参照します。関心のあるタイプStreamのAudio(読み取り専用)プロパティは、選択したリソース名から取得されます。
  • Marc-AndréJutrasが彼の答えで指摘したように、独自にコーディングするUITypeEditorTypeConverter、アセンブリからオーディオリソースを取得する必要があります。この場合、カスタムを実装することを選択しましたTypeConverter

    Public Class Form1
        <System.ComponentModel.TypeConverter(GetType(AudioConverter)), System.ComponentModel.DefaultValue("(none)")>
        Public Property AudioName As String
    
        <System.ComponentModel.Browsable(False)> 'This will make the property not appear in the designer
        Public ReadOnly Property Audio As Stream
            Get
                If String.IsNullOrWhiteSpace(AudioName) OrElse
                    AudioName = "(none)" Then
                    Return Nothing
                End If
                Try
                    Return My.Resources.ResourceManager.GetStream(AudioName)
                Catch ex As Exception
                    Return Nothing
                End Try
            End Get
        End Property
    End Class
    
    Public Class AudioConverter
        Inherits System.ComponentModel.TypeConverter
    
        Public Overrides Function GetStandardValuesSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True
        End Function
    
        ' Set the property to be informed only from predefined (standard) values
        Public Overrides Function GetStandardValuesExclusive(context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True
        End Function
    
        ' Get possible values that will be inserted in the drop-down list
        Public Overrides Function GetStandardValues(context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
    
            Dim returnList As New System.Collections.Generic.List(Of String)
            returnList.Add("(none)")
            For Each resItem As System.Collections.DictionaryEntry In My.Resources.ResourceManager.GetResourceSet(System.Globalization.CultureInfo.InvariantCulture, True, False)
                Dim resourceEntry As String = resItem.Key
                If TypeOf resourceEntry Is String Then
                    returnList.Add(resourceEntry)
                End If
            Next
    
            Return New System.ComponentModel.TypeConverter.StandardValuesCollection(returnList)
        End Function
    End Class
    
于 2012-10-29T00:34:37.227 に答える