AG_E_PARSER_UNKNOWN_TYPE resx problem

Av Claes Timåker 22. September 2009, 11:05
Visa profil för Claes Timåker

Jag håller för närvarande på att jobba med ett projekt där vi har en Silverlight klient.

Jag tänkte att jag skulle dela med mig av mina erfarenheter och motgångar under projektets gång

och hoppas att med mina motgångar kunna hjälpa er att komma förbi diverse hinder.

 

Idag tänkte jag förklara hur jag till slut lyckades med internationalization och localization.

Jag började med att skapa en katalog vid namn Resources och där i en Resource File fil med

namn Strings.resx. Visual Studio skapar även filen Strings.Designer.cs åt dig

(ifall ni använder VB.NET blir det givetvis .vb) och öppnar filen i Managed Resource Editor.

Sedan lade jag till ett par strängar och satte Access Modifier till Public.

På min XAML sida lade jag till

<UserControl.Resources>
  <local:Strings x:Key="LocStrings" />
</UserControl.Resources>

och inkluderade mitt namespace som i mitt fall blev xmlns:local="clr-namespace:Ntier.Kms.Client.Resources"

Nu var jag redo att börja implementera mina strängar med syntaxen:

Text="{Binding Source={StaticResource namnet_på_min_nyckel}, Path=namnet_på_min_sträng}"

Vilket i mitt fall blev:

<TextBlock Margin="10" Grid.Row="0" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=UserName}" Foreground="White" Width="115" />
<TextBlock Margin="10" Grid.Row="1" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=FirstName}" Foreground="White" Width="115" />
<TextBlock Margin="10" Grid.Row="2" Grid.Column="0" Text="{Binding Source={StaticResource LocStrings}, Path=LastName}" Foreground="White" Width="115" />

Efter allt detta provade jag att kompilera och starta klienten.....och fick felet:

AG_E_PARSER_UNKNOWN_TYPE [Line: 12 Position: 30]

Kom ihåg att jag satte Access Modifier till Public, men det hjälpte tydligen inte.

Jag gick in i Strings.Designer.cs filen och såg att konstruktorn var satt till

internal Strings() {
}

Efter att manuellt ändrat detta till

public Strings() {
}

går det att kompilera igen.

Kom ihåg att varje gång ni ändrar i Strings.resx filen kommer Designer.cs filen att återställa till internal,

så denna ändring måste göras om och om igen. SUCK! 

Jag tog även en kopia på min Strings.resx fil och döpte om den till Strings.sv-SE.resx där jag har mina strängar på svenska.

För att sv-SE filen ska kunna hittas måste projektfilen ändras manuellt. Jag öppnade csproj i notepad och letade efter

<SupportedCultures>. Där la jag till  <SupportedCultures>sv-SE</SupportedCultures>.

Det sista jag gjorde var att lägga till svenska som defaultspråk.

Detta gjorde jag i min App.xaml.cs fil där jag ändrade Application_Startup till

private void Application_Startup(object sender, StartupEventArgs e)
{
    var culture = new CultureInfo("sv-SE");
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;

    this.RootVisual = new MainPage();
}

Äntligen fick jag allt att fungera som jag hade tänkt. 

Till min hjälp använde jag mig av Tim Heuer's sida:

http://timheuer.com/blog/archive/2009/08/26/silverlight-string-localization.aspx

Återkommer med mer info angående valideringar i Silverlight inom kort.

 /Claes

 

Tags: , , ,

Silverlight

Silverlight 3 Visual Studio 2008 Designer Preview

Av Lars Rosén 21. September 2009, 09:24
Visa profil för Lars Rosén

Jag installerade Silverlight 3, javisst lite sent kanske, men nu är det gjort.

Vart tog min Designer Preview vägen???

Är det tänkt att man ska koda XAML i blindo och behöva köra igång projektet för att se om man tänkte rätt med kolumner, rader, färger och annat som kan vara lite lurigt att få till???

Nejdå, här är lösningen:

http://weblogs.asp.net/hpreishuber/archive/2009/07/18/silverlight-3-visual-studio-2008-designer-preview.aspx

Och för er som hellre vill läsa om det på svenska:

  1. Sätt markören strax under den horisontella scrollbaren så att du får en dubbelriktad pil (uppåt och neråt).
  2. Håll ner musknappen och dra uppåt.
  3. Nu kommer vår Designer Preview fram, bara att ladda om den och titta igen!

Tyvärr så försvinner den igen om du stänger filen och om man öppnar filen igen så visas inget i designern...

Inte helt optimalt, men bättre än ingenting!

Vi får hoppas på en Service Pack...

Tags: ,

Silverlight

SampleBrowser

Av Lars Rosén 4. September 2009, 19:53
Visa profil för Lars Rosén

Nu när alla semestrar är slut och höstmörkret faller så är det dags att börja testa nya sätt att koda Silverlight igen.

Då jag kollade på lite exempelkod på MSDN så snubblade jag över följande SampleBrowser som kan vara bra att känna till om man vill koda nåt man inte provat tidigare.

http://samples.msdn.microsoft.com/Silverlight/SampleBrowser

 

/Lars

Tags:

Silverlight

Enhetstestning av asynkrona anrop

Av Lars Rosén 6. July 2009, 23:46
Visa profil för Lars Rosén

Eftersom alla service-anrop i Silverlight måste göras ansynkrona behöver de kunna testas.
Men eftersom de är asynkrona så går det inte på ett vanligt sätt, utan det behövs lite extra.
Hemligheten ligger i ett attribut som heter [Asynchronous].
Dessutom måste testklassen ärva från SilverlightTest
Testen som markeras som asynkron får inte sitt testresultat förrens metoden EnqueueTestComplete anropas. 

Exempel:

[TestMethod]
[Asynchronous]
public void AsyncTest()
{

    SomeCallsHandler.onLoaded += (sender, e) =>
    {
        List theDates = (List)SomeCallsHandler.GetData(ServiceCalls .GetDatesAsync);
        string sb = (string)SomeCallsHandler.GetData(ServiceCalls.GreetingsAsync);
        Assert.AreEqual("Greetings Arne Anka", sb);
        EnqueueTestComplete();
    }

   
SomeCallsHandler.StartLoad();

}

Ha en bra sommar

/Lars

Tags: ,

Silverlight

Silverlight Unit Testing Framework

Av Lars Rosén 3. July 2009, 15:37
Visa profil för Lars Rosén

Tänkte att så här inför semestertider tipsa om enhetstestning av Silverlight-sidor.

http://code.msdn.microsoft.com/silverlightut/

 Här kommer en liten introduktion till hur man kan enhetstesta en Silverlight applikation:

  1. Ladda ner binärerna för Silverlight Unit Testing Framework här: http://code.msdn.microsoft.com/silverlightut/Release/ProjectReleases.aspx?ReleaseId=2913
  2. Spara DLL:erna på ett bra ställe där de är lätta att hitta från referensdialogen.
  3. Lägg till ett nytt Silverlight projekt, kalla det t.ex. "Test"
  4. Lägg till följande två referenser till projektet "Test":
    Microsoft.Silverlight.Testing.dll
    Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll
  5. Ta bort filen Page.xaml
  6. Ändra på vad som tilldelas RootVisual i App.xaml.cs till UnitTestSystem.CreateTestPage:
    this.RootVisual = UnitTestSystem.CreateTestPage();
  7. Skapa en klass som kallas "ClientTest", för att det testar själva klienten
  8. Lägg till följande using statements:
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Microsoft.Silverlight.Testing;
    till klassen "ClientTest".
  9. Lägg till ett till using statement:
    using UnitTestingSample;
    (om ditt testprojekt heter något annat så byt namn)
  10. Märk klassen ClientTest med [TestClass]
  11. Se till att klassen "ClientTest" ärver från klassen "SilverlightTest" enligt:
    "public class ClientTest: SilverlightTest"
  12. Skapa en privat variabel för Silverlight-applikationens klass som brukar heta Page:
    private Page TestPage;
  13. Lägg till en metod som initierar silverlight-sidan och visar upp den på Testpanelen så att den går att testa:
    [TestInitialize]
    public void PrepareTest()
    {
         TestPage = new Page();
         TestPanel.Children.Add(TestPage);
     }
  14. Lägg sedan till en test:
    [TestMethod]
    public void TestExample()
    {
         Assert.IsTrue(true);
    }
  15. Markera projektet "Test" som "StartUp Project"
  16. Kör och din browser kommer att visa vilka tester som körts och hur det gick.
  17. Lägg till riktiga tester som testar all logik som din Silverlight-applikation innehåller så att du får allt testat

TIPS: För att du ska kunna komma åt interna variabler och metoder i de projekt som du vill testa så skriv in följande i AssemblyInfo.cs under Properties i det projekt som ska testas:
[assembly: InternalsVisibleTo("Test")]
Det gör att från projektet Test kommer man åt alla interna variabler och metoder.

Jag har lagt till en ZIP-fil med en solution som innehåller en Silverlight-sida som enhets-testas enlight ovan.

/Lars

 UnitTestingSample.zip (734,50 kb)

Tags: ,

Silverlight

Silverlight Toolkit (av Team Silverlight)

Av Andreas Paulsson 16. June 2009, 10:10
Visa profil för Andreas Paulsson

Efter mycket om och men har jag och Lars svetsat ihop en Silverlight toolkit som vi hoppas kommer att bli användbar vid Silverlight-utveckling.

Projektet/komponenten består idag av fyra delar:

  • CssHandler
    Detta är en klass som klarar av att läsa en .css fil och applicera en rad egenskaper på komponenter som är specade i xaml.
    Den här klassen kommer att förändras inom kort så se till att komma tillbaks och titta efter uppdateringar.
  • Login
    En login komponent som klarar av att autentisera en användare och returnera ett användarobjekt som du själv skapat. Den använder sig ab ServiceCaller.
  • RightClick
    Möjlighet att ta över högerklicket i xaml och visa upp din egen contextmenu. Här medföljer även en enkare meny att fylla med innehåll och visa upp.
  • ServiceCaller
    Den asynkrona anropshanteraren som beskrivits här tidigare.

Vårt toolkit samt ett exempelprojekt finns att ladda hem från: http://www.synaptic.se/tools.aspx

Ha en bra dag!

Tags: , , , ,

Silverlight

Styling

Av Andreas Paulsson 27. May 2009, 11:17
Visa profil för Andreas Paulsson

I Silverlight är det som bekant enkelt att ändra utseende på kontroller, men ett dilemma som jag ofta hamnar i är att jag duplicerar stylingen.
Ett botemedel på det är att lägga dessa styles i app.xaml och på så sätt göra dem globala i applikationen.

Jag kanske sparkar in öppna dörrar nu, men jag det här sättet att skriva styles på är väldigt kraftfullt.
Bifogar ett exempel att titta på: SilverlightStyling.zip (39,38 kb)

Mer om detta kommer inom kort. Jag och Lars har diskuterat hur man skulle kunna göra detta ännu mera kraftfullt samt att underlätta för designers som inte är utvecklare.

Tags: ,

Silverlight

DeepZoom

Av Lars Rosén 14. May 2009, 19:58
Visa profil för Lars Rosén

Har ni provat DeepZoomComposer?

Det har jag och det är inte så svårt att få till ett fotoalbum, importera bilder, sprid ut bilderna och exportera till t.ex. ett Silverlight-projekt.

Starta VS och kör projektet och vips så har du ett interaktivt fotoalbum.

Jag funderade sedan vidare ihop med Andreas om vi inte kunde göra ett Fotoalbum med flera album, ungefär som man har sina bilder i kataloger...

Det som behövdes var då ett sätt att autogenerera DeepZoom-filerna.

Efter en hel del googlande så fanns svaret rätt nära, nämligen som en DLL bland filerna i DeepZoomComposer-katalogen (DeepZoomTools.DLL).

Det fanns inte nån direkt hjälp om hur man göra så det var det bara att börja testa sig fram...

Referera DLL:en, hittade att namespacet var Microsoft.DeepZoomTools och där fanns lite trevliga klasser att leka med och följande verkade mest intressanta:

  • Image - Används för att hantera en bild som ska läggas till i ett så kallat album.
  • CollectionCreator - Genererar en kollektion av de bilder man laddar in i sitt album.
  • SparseImageCreator - Genererar albumet som en bild.

Följande kodsnutt genererar en kollektion av två bilder:

//-------------------------
string Destination = "MyAlbum";
Collection<Microsoft.DeepZoomTools.Image> Images = new Collection<Microsoft.DeepZoomTools.Image>();
Images.Add(new Microsoft.DeepZoomTools.Image(".\\Images\\PC040248.JPG") { Dpi = new System.Windows.Point(1, 1), ViewportOrigin = new System.Windows.Point(-1, 0), ViewportWidth = 10 });
Images.Add(new Microsoft.DeepZoomTools.Image(".\\Images\\PB290059.JPG") { Dpi = new System.Windows.Point(1, 1), ViewportOrigin = new System.Windows.Point(-2, 0), ViewportWidth = 10 });
collectionCreator.Create(Images, Destination); 
//-------------------------

Dpi borde vara DotPerInch, men jag har inte lyckats få den att spela någon roll...
ViewPostOrigin är den position som bilden ska få, det konstig är att både X och Y ska vara negativa för att hamna på skärmen.
Normalt är att origo (x=0, y=0) sitter i det övre vänsta hörnet på skärmen och det verkar också var fallet med DeepZoom, men sedan måste X vara negativt åt höger och Y negativt neråt.
ViewPortWidth är hur stor hela albumet ska vara då ViewportOrigin används.
Om ViewportWidth har ett stort värde så måste ViewportOrigin ha stora värden för att hamna längre in på skärmen.

Projektet som DeepZoomComposern skapade har antagligen följande i sin XAML:

<MultiScaleImage x:Name="msi"/>

Vilket är själva bakgrunden till albumet och det är denna msi som behöver få reda på mitt nya album, så jag kopierar in filerna i min ClientBin-katalog och ser till så att ett event kör följande kod:

msi.Source = new DeepZoomImageTileSource(new Uri("MyAlbum.xml", UriKind.Relative));

Och vips så visas mitt nya album istället...

Om ni får problem eller undrar över något så hör av till mig: Lars

 

Tags: ,

Silverlight

Silverlight Toolkit

Av Lars Rosén 11. May 2009, 20:41
Visa profil för Lars Rosén

Har du missat Silverlight Toolkit?

Då tycker jag att du ska ta dej en titt på http://silverlight.codeplex.com/

Silverlight Toolkit är en samling komponenter m.m. från Microsoft som inte levereras med den ordinare releasen av Silverlight.

Här finns en hel del trevliga saker som kan hjälpa oss i vardagen som Silverlightutvekcklare.

Tanka hem, installera och hare bra!

/Lars

Tags: , , ,

Silverlight

Logon komponent

Av Andreas Paulsson 8. May 2009, 08:13
Visa profil för Andreas Paulsson

Just nu känns det lite som när Jim Carrey upptäcker att han har en massa krafter i filmen "Bruce Almighty".
Efter att jag fick till min hantering av asynkrona anrop med hjälp av reflection gjorde jag om en annan av
mina pryttlar som jag ständigt återanvänder. Nämligen en inloggningskomponent.

Det jag hade tidigare var ett någorlunda enkelt projekt att uppdatera, men jag hade två starka beroenden.

Det första var såklart en referens till servicen som autentiserar användaren.
Det andra var returtypen (som av någon anledning aldrig ser likadan ut fast att det alltid handlar om inloggning...)

Jag tog helt enkelt min ServiceCallerHandler som jag beskrivit i inlägget "En hanterare för asynkrona anrop" och
gjorde om inloggningen så att det enda den känner till är vad serviceanropet heter. Resten är magi.

Kolla ett exempel: LogOnExample.zip (777,65 kb)

Tags: , ,

Silverlight


Show all members