none
Probleme mit IExtenderProvider - Visual Studio 2010 RRS feed

  • Frage

  • Hallo zusammen,

     

    ich habe ein paar Probleme mit dem IExtenderProvider. Ich möchte damit einen MultiLanguage Support für meine Programme realisieren.

    Der Gedanke dahinter ist, jedem Kontroll wird ein fester Wordfetzen hinterlegt und dieser wird dann in der jeweiligen ausgewählten Programmsprache ausgegeben.

    Ich weiß das es Resourcen Dateien gibt, diese sind in meinem Fall aber eher unpraktikabel.

     

    Hier einmal meine LanguageProvider Klasse

    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports System.Security.Permissions
    
    <ProvideProperty("PhraseText", GetType(Control))> _
    <DefaultProperty("PhraseText")> _
    Public Class LanguageProvider
      Inherits Component
      Implements IExtenderProvider
    
    #Region "IExtenderProvider"
      Public Function CanExtend(ByVal extendee As Object) As Boolean Implements System.ComponentModel.IExtenderProvider.CanExtend
        Return (TypeOf extendee Is Control)
      End Function
    #End Region
    
    #Region "Control Dictionary"
      Private _ControlDictionary As Dictionary(Of Control, String)
    #End Region
    
    #Region "PhraseText"
    
      <Category("PhraseText"), DefaultValue("")>
      Public Property PhraseText(ByVal sender As Object) As String
        Get
          Dim result As String = String.Empty
          If _ControlDictionary Is Nothing Then Return result
          Dim currentControl As Control = TryCast(sender, Control)
          If currentControl IsNot Nothing Then
            If _ControlDictionary.ContainsKey(currentControl) Then
              result = _ControlDictionary(currentControl)
            End If
          End If
          Return result
        End Get
        Set(ByVal value As String)
          If _ControlDictionary Is Nothing Then _ControlDictionary = New Dictionary(Of Control, String)
    
          Dim currentControl As Control = TryCast(sender, Control)
    
          If currentControl IsNot Nothing Then
            If _ControlDictionary.ContainsKey(currentControl) Then
              _ControlDictionary(currentControl) = value
            Else
              _ControlDictionary.Add(currentControl, value)
            End If
            'TODO: Language Phrase übersetzen
            currentControl.Text = value
            currentControl.Invalidate()
          End If
        End Set
      End Property
    
    #End Region
    
    End Class
    
    

    Nun zu meinem Problem:

     

    Wenn ich andere Provder wie ErrorProvider oder HelpProvider einbinde, werden die Properties im Property Control von Visual Studio erweitert um die Funktionen der Provider. Leider ist dies bei meinem LanguageProvider nicht der Fall.

    Ich kann Code technisch auf die Funktion zugreifen, jedoch habe ich keine Möglichkeit, meinen Provider per GUI einzurichten. Jemand hier eine Idee ?

     

    Gruß Martin


    Donnerstag, 19. Mai 2011 19:42

Antworten

  • Hallo Martin,

    das kann schon nicht funktionieren, weil Deine zentrale Eigenschaft PhraseText einen Parameter erwartet.
    Du erwartest vermutlich, dass dort das verbundene Steuerelement übergeben wird, das ist aber niemals der Fall.

    Parametrisierte Eigenschaft werden generell vom Designer - ausgenommen des Indexer für eine Auflistung nicht unterstützt -
    und andere Sprachen wie C# können das auch nicht (der Code wäre dort nicht serialisierbar).

    Soweit dazu warum Du nichts zu sehen bekommst.

    Aber Dein Ansatz hat auch unter anderen Aspekten ein Problem:
    Du versuchst Dich dort ein bißchen wie Münchhausen mit Schopf aus dem Sumpf zu ziehen.

    Denn hier fehlt die Stelle, um die notwendigen Werte für die Übersetzung der Text-Eigenschaft bereitzustellen.
    Auch wenn Du Dir jeweils ein Dictionary erstellst, so hat das keinen Inhalt.
    Das Setzen des Steuerlement-Textes wäre nur zur Laufzeit sinnvoll.
    Ersetzt Du den Text bereits zur Entwurfszeit so könntest Du ebenso die Text-Eigenschaft selbst verwenden.
    (am Rande: das Invalidate ist überflüssig).

    Der von Windows Forms implementiert Weg wäre da schon der bessere - die Ressourcen mal aussen vorgelassen.
    Das Anpassen an die Sprache erfolgt dort über den ComponentResourceManager über ApplyResources,
    siehe Improvements to Localization in Visual Studio 2005 (und seit dem hat sich nichts wesentlich dran geändert.

    Nachteil ist dort zum einen dass dies nur beim Erzeugen (in InitializeComponent) erfolgt.
    Der andere, dass dort die Ressourcen verwendet werden, was man aber durch einen eigenes ResourceSet ersetzen kann.

    Auf CodeProject findest Du einige Projekte die dem Mangel abhelfen wollen:
    UICultureChanger component
    Changing Your Application User Interface Culture On The Fly
    (Der Code ist in C#, ich kann aber bei Interesse aushelfen)

    Gruß Elmar

     

    Freitag, 20. Mai 2011 09:18
    Beantworter