Benutzer mit den meisten Antworten
Probleme mit IExtenderProvider - Visual Studio 2010

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
- Bearbeitet Martin Stühmer Donnerstag, 5. November 2015 08:24
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
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 26. Mai 2011 09:57