Benutzer mit den meisten Antworten
.NET in Silverlight code behind nur zur Entwurfszeit

Frage
-
Hallo,
weiß jemand ob es, irgendwie möglich ist, eine Funktionalität aus einer .NET Bibliothek beschränkt auf die Entwurfszeit (in Blend oder VS) im Rahmen eines Silverlight Projekts zu nutzen?
Nach meinen Überlegungen ginge das, wenn überhaupt, nur über ein Add-In für Blend. Richtig?
Bin für jede Idee, die es mir erspart, ein Add-In zu schreiben, dankbar.
Martin
Montag, 20. September 2010 14:58
Antworten
-
Hallo,
das Add-In das ich entwickeln wollte ist fertig und kann kostenlos heruntergeladen werden. Information zum Add-In gibt es in meinem Blog.
Besten Dank nochmals für die Hilfe hier. Auch wenn ich letztlich einen anderen Weg gewählt habe, habe ich doch wieder etwas dazugelernt.
Martin
- Als Antwort markiert Robert Breitenhofer Donnerstag, 30. September 2010 11:28
Donnerstag, 30. September 2010 11:00
Alle Antworten
-
Hallo Martin,
ich weiß zwar nicht genau was du umsetzten willst, aber evtl. hilf die ja die DesignerProperties.GetIsInDesignMode() Methode.
Hier der Link zur Erläuterung: http://msdn.microsoft.com/de-de/library/system.componentmodel.designerproperties.getisindesignmode(v=VS.95).aspx
Daniel
Silverlight-Community.deMontag, 20. September 2010 15:26 -
Hallo Daniel,
etwaige Fehlkommunikation liegt immer am Sender. Habe mich wohl nicht konkret genug ausgedrückt.
DesignerProperties.GetIsInDesignMode gibt es natürlich in Silverlight 3 und 4. Ich möchte aber, wenn es geht, nach Prüfung auf True nicht auf eine Klasse aus einer Silverlight Library zugreifen, sondern aus einer .NET Library. Also z.B. aus eine .dll für WPF.
Und ich fürchte, dafür müßte ich ein Expression Blend Add-In schreiben.
Mittwoch, 22. September 2010 06:35 -
Hallo allerseits,
Martin, wenn du auf eine Klasse von .NET zugreifst, kann man dann eigentlich noch von einer Silverlight-Anwendung sprechen? Es liegt doch in der Natur von Silverlight, dass es eingeschränkte Funktionalität z.B. gegenüber WPF aufweist. Oder mache ich da einen Denkfehler?Mittwoch, 22. September 2010 08:32 -
Ich möchte aber, wenn es geht, nach Prüfung auf True nicht auf eine Klasse aus einer Silverlight Library zugreifen, sondern aus einer .NET Library. Also z.B. aus eine .dll für WPF.
... ich würde sagen das geht nicht. Die Assemblys sind zwar ähnlich (evtl. sogar identisch) aufgebaut, basieren aber auf einer unterschiedlichen CLR.
Daniel
Silverlight-Community.deDonnerstag, 23. September 2010 10:53 -
Hallo LB.,
> Ich möchte aber, wenn es geht, nach Prüfung auf True nicht
> auf eine Klasse aus einer Silverlight Library zugreifen, sondern aus
> einer .NET Library. Also z.B. aus eine .dll für WPF.ja, das geht.
(Natürlich ist ein "direkter" Zugriff auf normalem Wege auf die Dll nicht vorgesehen).
In solchen Fällen kann man über "Code-Linking" arbeiten.
Das bedeutet zum Beispiel, dass eine vorhandene C# Klasse in einer "normalen DLL" (Nicht SL-DLL) existiert.
Diese ruft die gewünschte Methode aus der WPF DLL auf.
Der Trick ist nun, in einer Silverlight-DLL: "rechte Maus" / Hinzufügen / ein vorhandenes Element / "Klasse aus der 'Normal-DLL' anwählen / Rechts unten Pfeil: als Link hinzufügen /
zu wählen. Und - keine Sorge, das wird einigen professionellen Projekten von MS auch so gemacht. Speziell, wenn für WPF und Silverlight gleichzeitig ge-targeted werden muss. Auch bei Ressourcen, die Nicht-SL Projekte und andere gleichzeitig benötigen ist dies eine saubere Technik.
ciao FrankDonnerstag, 23. September 2010 18:36 -
Hallo Frank,
danke für die Antwort. Geniale Idee. Das mit der Verlinkung funktioniert soweit. Aber ich habe folgendes Problem.
In der "normalen" Klasse mache ich einen Zugriff auf System.Windows.Clipboard und weise dann (immernoch in der "nromalen" Klasse) mit WPFrtb.Paste() den Inhalt des Clipboard der WPF-RichTextBx zu. (Ich brauche .NET's System.Windows.Clipboard wegen des größeren Funktionsumfangs.)
Er kennt dann im Silverlight-Projekt, in das ich die .DLL verlinkt habe, aber weder System.Windows.Clipboard noch .Paste() als Methode meiner WPF-RichTextBox.
Hast Du vielleicht ein Beispiel oder einen weiterführenden Link für mich?
Martin
Freitag, 24. September 2010 13:01 -
Hallo zusammen,
das, was ich immernoch am Liebsten direkt als Feature direkt in Expression Blend anbieten würde, habe ich jetzt als Standalone Tool veröffentlicht. Alle weiteren Infos findet Ihr in diesem Thread hier im Forum zu einem Video, das ich zum Tool und dem parallel entwickelten UserControl erstellt habe.
Was meine Frage hier angeht, ich glaube, ich komme wohl um ein Add-In nicht herum ... ?!?
Sonntag, 26. September 2010 17:52 -
In der "normalen" Klasse mache ich einen Zugriff auf System.Windows.Clipboard und weise dann (immernoch in der "nromalen" Klasse) mit WPFrtb.Paste() den Inhalt des Clipboard der WPF-RichTextBx zu. (Ich brauche .NET's System.Windows.Clipboard wegen des größeren Funktionsumfangs.)
Er kennt dann im Silverlight-Projekt, in das ich die .DLL verlinkt habe, aber weder System.Windows.Clipboard noch .Paste() als Methode meiner WPF-RichTextBox.
Hey Martin,
das ist das Problem am verlinkten Code. So etwas funktioniert leider nur bedingt, da man in der Regel ja nicht darauf achtet ob der verwendete Namespace auch in den anderen Umgebungen verfügbar ist.
Ich persönlich nutze diese Funktion recht selten.
Das Problem lässt sich aber relativ einfach über Präprozessordirektiven lösen, sofern die Funktionalität (hier Clipboard) auch in der anderen Welt existiert.
Definiere in deiner Silverlight - Anwendung einfach einen Wert zum Beispiel "#define SILVERLIGHT" (oder mache das in den Projekteigenschaften).
Im gemeinsamen Code kannst du dann eine Spezialimplementierung einbauen.
Beispiel:
#if SILVERLIGHT //hier den Code rein um auf die Zwischenablage per SL zuzugreifen #else //hier den originalen Code drinn lassen (Rich .Net) #endif
Der Compiler blendet dann den enstprechendne Code aus.
Nachteil: Es wird schnell unübersichtlich. Da solltest du dir dann überlegen deine Objekte evtl. neu Aufzuteilen.
Daniel
Silverlight-Community.deMontag, 27. September 2010 08:34 -
Hallo Martin,
wir ziehen momentan um, deswegen kann ich mich nur spoardisch melden.
> geniale Idee. Funktioniert soweit.
ok - ist hier aber das Standard-Handling, in solchen Fällen.
> WPFrtb.Paste() den ....
Also wenn wirklich ganz spezielle Dinge - die nur Silverlight (oder nur WPF) betreffen erforderlich sind, implementiert auch Microsoft hier folgendes:#if SILVERLIGHT //Silverlight compatible code goes here #else //WPF compatible code goes here #endif
[Extending Silverlight to WPF (and Vice-Versa)]
http://www.devx.com/RIA/Article/41097/0/page/3
Bei Silverlight-Projekten ist die Konstante SILVERLIGHT normal vordefiniert ist benötigt man normal kein manuelles Setzen von "#define SILVERLIGHT". (-> Eigenschaften des Projektes / Erstellen).
Oft wird aber Copy, Paste etc. viel über Commands gehandelt.
-> ApplicationCommands.Copy, Paste, Cut !
ciao FrankMontag, 27. September 2010 08:52 -
Hallo,
erstmal vielen Dank für die Vorschläge und Ideen hier. Nach mehreren Probeläufen mit den hier vorgeschlagenen Wegen habe ich mich dann doch entschlossen, direkt den Weg in Expression Blend 4 hinein zu suchen.
Und ich habe ihn gefunden: Dank eines sehr instruktiven Artikels von Timmy Kokke. Er beschreibt für Expression Blend 4 Beta, wie man Erweiterungen für Expression Blend schreibt. Ich habe das Beispiel in seinem Artikel in VB.NET nachvollzogen und es funktioniert wunderbar.
Das coole an der Lösung von Timmy Kokke ist, dass man die Erweiterung für Blend 4 direkt als WPF schreiben kann, also von Haus aus mit der vollständigen .NET 4 Unterstützung. Genau das was ich brauche.
Wer den Artikel von Timmy Kokke in VB.NET nachvollziehen will, findet nachstehend den VB.NET code der von Timmy Kokke gebildeten Klasse DemoExtension1:
Imports System.ComponentModel.composition Imports Microsoft.Expression.Extensibility Imports Microsoft.Expression.Framework.UserInterface Namespace DemoExtension1 <Export(GetType(IPackage))> _ Public Class DemoExtension1 Implements Microsoft.Expression.Extensibility.IPackage Sub Load(ByVal services As Microsoft.Expression.Extensibility.IServices) Implements IPackage.Load Dim windowService As IWindowService = CType(services.GetService(GetType(IWindowService)), IWindowService) Dim uc As UserControl1 = New UserControl1() windowService.RegisterPalette("DemoExtension", gd, "Demo Extension") End Sub Public Sub Unload() Implements IPackage.Unload ' code End Sub End Class End Namespace
Diese Klasse ebnet im Grunde genommen den Weg hinein in Expression Blend 4.
Ein Tipp noch: Den Ordner \Extensions, in den man die fertige .dll ablegen muss, werdet ihr unter C:\Program Files (x86)\Microsoft Expression\Blend 4\ vergeblich suchen. Das Problem läßt sich aber einfach lösen: Einfach einen neuen Ordner \Extensions unter dem Pfad erstellen und die fertige .dll dort ablegen. Blend greift dann beim Start der Entwicklungsumgebung darauf zu.
Beste Grüße,
Martin
Mittwoch, 29. September 2010 14:57 -
Hallo,
das Add-In das ich entwickeln wollte ist fertig und kann kostenlos heruntergeladen werden. Information zum Add-In gibt es in meinem Blog.
Besten Dank nochmals für die Hilfe hier. Auch wenn ich letztlich einen anderen Weg gewählt habe, habe ich doch wieder etwas dazugelernt.
Martin
- Als Antwort markiert Robert Breitenhofer Donnerstag, 30. September 2010 11:28
Donnerstag, 30. September 2010 11:00 -
Hallo L.,
ja, mit MEF ist sowas standardmäßig unter VS 2010 immer recht einfach machbar (nutzen wir auch extensiv).
Es sollte allerdings angemerkt werden, das Deine Entscheidung für ein AddIn nicht "notwendig" ist, insofern IMHO (genau gesehen) nur ein Workaround und nicht ganz die Antwort auf Deine eigentliche Frage, die ja das AddIn umgehen wollte.
____________Vielleicht noch ein Aspekt, den MS für Designer-Erweiterungen bei WPF/Silverlight standardmäßig nutzt und empfiehlt: über TypeIdentifier (Microsoft.Windows.Design.Metadata) zu gehen. Das machen wir in Designer-Bereichen übrigens auch nutzen. Der eigentliche Typ ist dann normal ein ModelItem (quasi ein Wrapper um die nativen SL/WPF-Klassen) und wird erst intern zu einem Silverlight/Wpf oder (XXX-) Typ. Das aber nur nebenbei.
[WPF & Silverlight Design-Time Code Sharing – Part I - WPF & Silverlight Designer - Site Home - MSDN Blogs]
http://blogs.msdn.com/b/wpfsldesigner/archive/2010/01/13/wpf-silverlight-design-time-code-sharing-part-i.aspxs.a. [WPF Samples]
ciao FrankDonnerstag, 30. September 2010 13:43