2010-10-19 4 views
10

Wenn ich meine Ressource-Datei ändern (.resx) Text hinzufügen oder ändern, der Konstruktor meiner Ressource immer zu internen gehen und danach, wenn ich meine Silverlight ausführen, habe ich einen Fehler in meiner XAML-Bindung .Silverlight Ressource Konstruktor immer zurück zu internen

Gibt es eine Möglichkeit, dieses Szenario zu vermeiden? Ich muss im Designer meiner Ressource gehen und den Konstruktor Öffentlichkeit stellen das Problem

ich so meine Ressource in meiner XAML-Datei für diese

<UserControl.Resources> 
     <resources:LibraryItemDetailsView x:Key="LibraryItemDetailsViewResources"></resources:LibraryItemDetailsView> 
    </UserControl.Resources> 


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock> 
+0

Ich habe das gleiche Problem, es ist nervig ... – Rumplin

+0

Ich habe [this] (http://stackoverflow.com/a/16174350/385995) in WPF getan, sollte auch für Silverlight arbeiten. –

Antwort

0

Der Grund, dass Sie ist verwenden zu lösen sollte die Klasse nicht selbst instanziieren. Sie sollten stattdessen immer ConsoleApplication1.Resource1.ResourceManager verwenden, die selbst die Klasse für Sie instanziiert.

Hier ist ConsoleApplication1 der Name Ihrer Baugruppe und Resource1 der Name Ihrer Ressourcendatei.

+0

Können Sie mir ein Beispiel mit Bindung geben? –

+0

Der von Ihnen erwähnte ResourceManager stellt die String-Variablen nicht zur Verfügung, so dass er nicht bindbar ist. Sie müssen eine GetX-Methode verwenden, um daraus Werte zu erhalten. – Aligned

3

Sie können eine öffentliche Klasse, die die Ressourcen durch eine Eigenschaft macht:

public class StringsWrapper 
{ 
    private static LibraryItemDetailsView _view = null; 

    public LibraryItemDetailsView View 
    { 
     get 
     { 
      if (_view == null) 
      { 
       _view = new LibraryItemDetailsView(); 
      } 
      return _view; 
     } 
    } 
} 

Dann in Ihrem XAML Sie Ihre Ressource zugreifen können:

<UserControl.Resources> 
    <StringsWrapper x:Key="LibraryItemDetailsViewResources"></StringsWrapper> 
</UserControl.Resources> 


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=View.FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock> 

Auf diese Weise der resx Konstruktor kann intern sein !

1

Nun, was ich tat, war ein Kommandozeilenprogramm hinzufügen Ereignis jedes Silverlight-Projekt Pre-Build, die jeden internalstring mit public :)

Sie ersetzt können Pre-Build bearbeiten und Postbuildereignisse nach: Klicken Sie mit der rechten Maustaste auf ein Projekt ->Properties ->Build Events.

Ich habe ein Dienstprogramm namens RXFIND, es ist kostenlos und kann eine Zeichenfolge in ausgewählten Dateien mit einem regulären Ausdruck RegEx ersetzen.

Hier ist die Befehlszeile Ich verwende:

"$(SolutionDir)ThirdParty\rxfind\rxfind.exe" "$(ProjectDir)Resources\*.Designer.cs" "/P:internal " "/R:public " /Q /B:2 

Bitte beachten Sie, dass alle meine Ressourcen unter Ressourcenverzeichnis in jedem Projekt befinden und die Befehlszeilen-Dienstprogramm befindet sich in \ThirdParty\rxfind Verzeichnis

0

I erstellt ein Makro, das ich für jede Datei, die ich bearbeite, mache. Ich muss immer noch daran denken, es auszuführen, aber es ist viel schneller. Bitte sehen Sie my post.

1

Ich habe auch den gleichen Fehler.Um das Problem zu lösen Ich habe gerade ein public class, die von der Klasse erbt, die die Ressourcen-Datei, zu wissen, dass es auch öffentliche Klasse sein muss, das ist mein exep:

public class TrackResourceWrapper : TrackResource 
{ 
} 

mit: TrackResourceWrapper erbt Klasse TrackResource ist die Klasse, die hinter in der Code-Ressource-Datei (public class)

einfach
1

befindet:

  1. eine neue Klasse hinzufügen, die von der Resourc erbt e Klasse
  2. In der App.xaml Datei, ändern Sie die Ressourcenklasse, die Sie
  3. erstellt

Fertig!

Verwandte Themen