Mein Kollege Achim braucht Feedback –> Antworten bitte hier hin.
“Hallo liebe Entwickler,
wir (Developer-Marketing-Team bei Microsoft) überlegen derzeit, möglicherweise einen Service zum aktuellen Windows 7 RC speziell für Software-Entwickler in Deutschland anzubieten. Wir würden Euch hiermit gern um Eure Meinung bitten, um zu sehen, wie wertvoll ein solcher Service für Euch wäre. Ob es implementiert wird hängt auch (aber nicht nur) vom Feedback ab. :)
Wäre super, wenn Ihr Euch kurz die folgende Beschreibung durchlesen und uns unkompliziert/kurz/unverblümt/direkt Euer Feedback zu dieser Idee geben würdet. Vielen Dank im voraus!!
Beschreibung:
Du ärgerst Dich auch immer, dass bei einer OS-Neuinstallation alle Deine Lieblingstools erneut installiert werden müssen? Was war noch mal die URL??
Die Grundidee wäre also, Euch als Entwicklern zu helfen, Windows 7 (RC) auf Eurer eigenen Maschine zu testen und den Setup zu erleichtern, so wie ihn eben ein Software-Entwickler benötigt. Dazu könnte man sich den W7-RC installieren und dann über ein Interface (online oder via CD/DVD) die wichtigsten Developer-Tools aussuchen, die auch direkt installiert werden sollen. Dafür würde Microsoft eine Auswahlliste von Tools präsentieren, die im Anschluss je nach Selektion installiert werden würden. Jeder Software-Entwickler benötigt z.B. eine ZIP-Applikation, einen Editor oder ein einfaches Grafikprogramm. Source könnten beispielsweise die „Hanseltools“ sein, die Ergebnisse der MSDN Blogparade oder auch andere Listen. Das Prinzip des Installers wäre dann ähnlich zum Microsoft Web Platform Installer. Eventuell wäre eine Community gepflegte Liste (Wiki o.ä.) angedacht.
Was meint Ihr dazu? – Gute Idee? Schlechte Idee? Würdest Du so einen Service nutzen? Würdest Du Deinen Freunden und Kollegen davon erzählen? Was würdest Du anders machen? Worauf sollten wir achten, wenn wir es denn implementieren sollten? Danke! Achim”
Tja, endlich hat es mein Ex-Arbeitgeber auch verstanden …
Mit Silverlight sind einfach tolle Anwendungen möglich.
Einmal BMW –> http://www.rtl.de/auto/auto_987595.php
Und einmal Audi –> http://www.rtl.de/auto/auto_983806.php
Sehr cool.
Endlich ist die TechEd auch mal wieder in Deutschland im schönen Berlin zu Gast.
Vom 9. bis 13. November findet sie diesmal mit neuem Setup statt.
Mehr Informationen gibt es unter: http://www.microsoft.com/europe/teched/
Eine Auswahl von MSDN-Webcasts wird nun für einen gewissen Zeitraum exklusiv über den Developer-Channel auf Heise.de zur Verfügung gestellt. Im Klartext bedeutet dies, dass Heise-Leser auf die ausgewählten Webcasts bereits 2 Wochen vor dem Release auf dem MSDN Portal zugreifen können. Damit wird die gute Zusammenarbeit zwischen Heise und MSDN ein weiteres Mal unterstrichen. Den Anfang dieses Projektes bildet die 5tlg. Webcast-Serie von Patrick A. Lorenz zur Pragmatischen Webarchitektur mit ASP.Net 3.5. Zu den ersten beiden Teilen sind auf Heise auch bereits die News veröffentlicht worden:
http://www.heise.de/developer/MSDN-Webcast-zur-pragmatischen-Web-Architektur-mit-ASP-NET-3-5--/news/meldung/140148
http://www.heise.de/developer/MSDN-Webcast-zur-Web-Architektur-mit-ASP-NET-3-5-Teil-2--/news/meldung/140387
Mit einer Aktion, bei der alle nur gewinnen können, will Microsoft Deutschland in den kommenden Monaten dafür sorgen, dass Webseiten künftig möglichst umfassend den geltenden Webstandards folgen. Im Rahmen der „Besserweb“-Initiative sollen dabei Web-Angebote identifiziert werden, die mit dem Internet Explorer 8 bislang nicht korrekt angezeigt werden oder gar nicht funktionieren. Betreiber solcher Webseiten will Microsoft bei der standardkonformen Anpassung ihres Webservice unterstützen. Als Betreiber einer Webseite kann man auch selber schnell und einfach für eine kurzfristige Lösung sorgen, wenn die eigene Seite im Internet Explorer 8 in dessen Standardansicht offensichtlich nicht korrekt dargestellt wird oder funktioniert: Kurzfristig die eigene Seite kompatibel machen User[KG1] , die bei der Aktion mitmachen möchten und entsprechende Webseiten melden, können dabei sogar gewinnen: jeden Monat eines von 160 T-Shirts und bei der Schlussverlosung weitere wertvolle Preise wie Xbox 360, Netbook mit Windows 7 oder eine Visual Studio 2010 Professional Edition. Die Besserweb-Initiative läuft noch bis zum Jahresende und jede Einreichung zählt sogar doppelt – sowohl für die monatliche Verlosung, als auch für die Jahresendverlosung mit wertvollen Hauptgewinnen. Ihr gewinnt Preise. Das Web gewinnt an Wert: http://www.msdn-online.de/BesserWeb
Die neue deutschsprachige Anlaufstelle zu Microsoft Windows Azure ist da: www.azure-forum.net. Hier werden alle Fragen rund um Windows Azure und Azure-Services beantwortet. Auch bei Fragen zur Installation oder dem Einrichten wird hier geholfen. Gute Anleitungsartikel helfen bei dem Einstieg mit Microsoft Windows Azure. Also, schau vorbei unter www.azure-forum.net.
Eine der interessantesten Silverlight-Blogs der letzten Zeit ist diese: www.shinedraw.com .
Dort werden sehr interessante und typische Flash-Elemente in direkten Vergleich zu Silverlight entwickelt und gegenübergestellt. Inklusive Sourcecode.
Neuestes Schmankerl ist ein Explorer-like-Control zur Darstellung von einem Bilderverzeichnis inkl. Unterverzeichnisses auf einem Server mit Hilfe von Silverlight und PHP.
Mehr Infos: http://www.shinedraw.com/data-handling/silverlight-photo-explorer-10/
Ich bin vor einigen Tagen über dieses (sehr geniale) Tool gestolpert.
Silverlight Spy
Mit diesem “Spion” kann man Silverlight Anwendungen komplett analysieren und auskundschaften.
Sehr leicht via ClickOnce installierbar von hier: http://silverlightspy.com/silverlightspy/download-silverlight-spy/
Auf Codeplex haben einige meiner Kollegen ein Dokument bereit gestellt, das die Gemeinsamkeiten und Unterschiede von WPF und Silverlightbeschreiben.
Sehr lesenswert: Microsoft WPF-Silverlight Comparison Whitepaper
Basierend auf der Inspiration von http://www.eggheadcafe.com/tutorials/aspnet/05748429-75a4-449a-9aab-82758cfb13df/animating-mandelbrot-frac.aspx habe ich mich drangesetzt ein kleines Control für die Erstellung und Berechnung von Mandelbrot-Grafiken zu erzeugen. Im Gegensatz zum Original, habe ich das Control allerdings so geschrieben, das alle Parameter über Dependancy Properties in Blend konfigurierbar und animierbar sind.
Einige Impressionen …
Das ganze lässt sich übrigens in prima in Blend über die Eigenschaften konfigurieren.
Der Code für das Mandelbrot-Control …
1: using System;
2: using System.Windows;
3: using System.Windows.Controls;
4: using System.Windows.Media;
5: using System.Windows.Media.Imaging;
6:
7: namespace Homepage.Fun.Mandelbrot
8: {
9: public partial class MandelbrotControl : UserControl
10: {
11: public MandelbrotControl()
12: {
13: InitializeComponent();
14:
15: DrawMandelbrotSet();
16: }
17:
18: #region Dependancy Properties
19:
20: public double RMin
21: {
22: get { return (double)GetValue(RMinProperty); }
23: set
24: {
25: SetValue(RMinProperty, value);
26: DrawMandelbrotSet();
27: }
28: }
29:
30: public static readonly DependencyProperty RMinProperty =
31: DependencyProperty.Register("RMin", typeof(double),
32: typeof(MandelbrotControl),
33: new PropertyMetadata(-.75,
34: null));
35:
36: public double RMax
37: {
38: get { return (double)GetValue(RMaxProperty); }
39: set
40: {
41: SetValue(RMaxProperty, value);
42: DrawMandelbrotSet();
43: }
44: }
45:
46: public static readonly DependencyProperty RMaxProperty =
47: DependencyProperty.Register("RMax", typeof(double),
48: typeof(MandelbrotControl),
49: new PropertyMetadata(-.46,
50: null));
51:
52: public double IMin
53: {
54: get { return (double)GetValue(IMinProperty); }
55: set
56: {
57: SetValue(IMinProperty, value);
58: DrawMandelbrotSet();
59: }
60: }
61:
62: public static readonly DependencyProperty IMinProperty =
63: DependencyProperty.Register("IMin", typeof(double),
64: typeof(MandelbrotControl),
65: new PropertyMetadata(-.65,
66: null));
67:
68: public double IMax
69: {
70: get { return (double)GetValue(IMaxProperty); }
71: set
72: {
73: SetValue(IMaxProperty, value);
74: DrawMandelbrotSet();
75: }
76: }
77:
78: public static readonly DependencyProperty IMaxProperty =
79: DependencyProperty.Register("IMax", typeof(double),
80: typeof(MandelbrotControl),
81: new PropertyMetadata(-.50,
82: null));
83:
84: public int Escape
85: {
86: get { return (int)GetValue(EscapeProperty); }
87: set
88: {
89: SetValue(EscapeProperty, value);
90: DrawMandelbrotSet();
91: }
92: }
93:
94: public static readonly DependencyProperty EscapeProperty =
95: DependencyProperty.Register("Escape", typeof(int),
96: typeof(MandelbrotControl),
97: new PropertyMetadata(20,
98: null));
99:
100: public int Max
101: {
102: get { return (int)GetValue(MaxProperty); }
103: set
104: {
105: SetValue(MaxProperty, value);
106: DrawMandelbrotSet();
107: }
108: }
109:
110: public static readonly DependencyProperty MaxProperty =
111: DependencyProperty.Register("Max", typeof(int),
112: typeof(MandelbrotControl),
113: new PropertyMetadata(30,
114: null));
115:
116: public double Step
117: {
118: get { return (double)GetValue(StepProperty); }
119: set
120: {
121: SetValue(StepProperty, value);
122: DrawMandelbrotSet();
123: }
124: }
125:
126: public static readonly DependencyProperty StepProperty =
127: DependencyProperty.Register("Step", typeof(double),
128: typeof(MandelbrotControl),
129: new PropertyMetadata(.002,
130: null));
131:
132: public int Count
133: {
134: get { return (int)GetValue(CountProperty); }
135: set
136: {
137: SetValue(CountProperty, value);
138: DrawMandelbrotSet();
139: }
140: }
141:
142: public static readonly DependencyProperty CountProperty =
143: DependencyProperty.Register("Count", typeof(int),
144: typeof(MandelbrotControl),
145: new PropertyMetadata(100,
146: null));
147:
148: public int ImageWidth
149: {
150: get { return (int)GetValue(ImageWidthProperty); }
151: set
152: {
153: SetValue(ImageWidthProperty, value);
154: DrawMandelbrotSet();
155: }
156: }
157:
158: public static readonly DependencyProperty ImageWidthProperty =
159: DependencyProperty.Register("ImageWidth", typeof(int),
160: typeof(MandelbrotControl),
161: new PropertyMetadata(400,
162: null));
163:
164:
165: public int ImageHeight
166: {
167: get { return (int)GetValue(ImageHeightProperty); }
168: set
169: {
170: SetValue(ImageHeightProperty, value);
171: DrawMandelbrotSet();
172: }
173: }
174:
175: public static readonly DependencyProperty ImageHeightProperty =
176: DependencyProperty.Register("ImageHeight", typeof(int),
177: typeof(MandelbrotControl),
178: new PropertyMetadata(400,
179: null));
180:
181: public int PowFactor
182: {
183: get { return (int)GetValue(PowFactorProperty); }
184: set
185: {
186: SetValue(PowFactorProperty, value);
187: DrawMandelbrotSet();
188: }
189: }
190:
191: public static readonly DependencyProperty PowFactorProperty =
192: DependencyProperty.Register("PowFactor", typeof(int),
193: typeof(MandelbrotControl),
194: new PropertyMetadata(5,
195: null));
196:
197: public double Param1
198: {
199: get { return (double)GetValue(Param1Property); }
200: set
201: {
202: SetValue(Param1Property, value);
203: DrawMandelbrotSet();
204: }
205: }
206:
207: public static readonly DependencyProperty Param1Property =
208: DependencyProperty.Register("Param1", typeof(double),
209: typeof(MandelbrotControl),
210: new PropertyMetadata(2.0,
211: null));
212:
213: #endregion
214:
215: private void DrawMandelbrotSet()
216: {
217: double rmin = (double)this.GetValue(RMinProperty);
218: double rmax = (double)this.GetValue(RMinProperty);
219: double imin = (double)this.GetValue(RMinProperty);
220: double imax = (double)this.GetValue(RMinProperty);
221:
222: double step = (double)this.GetValue(StepProperty);
223: int max = (int)this.GetValue(MaxProperty);
224: int escape = (int)this.GetValue(EscapeProperty);
225:
226: int width = (int)GetValue(ImageWidthProperty);
227: int height = (int)GetValue(ImageHeightProperty);
228: int powFactor = (int)GetValue(PowFactorProperty);
229: int count = (int)this.GetValue(CountProperty);
230:
231: double param1 = (double)GetValue(Param1Property);
232:
233: rmin -= step * count;
234: rmax += step * count;
235: imin -= step * count;
236: imax += step * count;
237:
238: WriteableBitmap bitmap = new WriteableBitmap(width, height, PixelFormats.Bgr32);
239:
240: double dr = (rmax - rmin) / (width - 1);
241: double di = (imax - imin) / (height - 1);
242:
243: for (int x = 0; x < width; x++)
244: {
245: double cr = rmin + (x * dr);
246: for (int y = 0; y < height; y++)
247: {
248: double ci = imin + (y * di);
249: double zr = cr;
250: double zi = ci;
251: int counter = 0;
252:
253: while (counter < max)
254: {
255: double zr2 = zr * zr;
256: double zi2 = zi * zi;
257:
258: if (zr2 + zi2 > escape)
259: {
260: bitmap.Pixels[(y * width) + x] = (int)Math.Pow(counter + 1, powFactor) % int.MaxValue;
261: break;
262: }
263: zi = ci + (param1 * zr * zi);
264: zr = cr + zr2 - zi2;
265: counter++;
266: }
267:
268: if (counter == max)
269: {
270: bitmap.Pixels[(y * width) + x] = 0; // Black
271: }
272: }
273: }
274:
275: _image.Source = bitmap;
276: }
277: }
278: }
Community-Event-Werbung aus der Heimat ;)
“Am 28. August ist es wieder so weit. Die Community in Nordrhein-Westfalen gibt sich wie jedes Jahr die Ehre und veranstaltet das größte Event für Software-Entwickler, IT-Pros und dieses Jahr auch für UI-Designer.
Buchen Sie jetzt Ihr Ticket zum Wissensvorsprung und melden Sie sich heute noch zur NRW Conf 09 und zum Workshop Day an. Nationale und internationale Speaker bringen Ihnen neueste Developer und IT-Pro Technologien näher. Profitieren auch Sie vom Networking mit anderen Gästen auf unserem gemeinsamen Flug durch die IT.
Immer noch nicht überzeugt? Lesen sie unser Feedback vom letzten Jahr. “
Ein neues Feature von Silverlight sind Behaviors. Dieses Feature wurde von WPF abgeguckt. Das schöne daran ist … diese WPF Behaviors können nahezu 1:1 wieder verwendet werden. Aber mal der Reihe nach.
Was sind Behaviors?
Behaviors sind eine Art von Verhalten, welches man einem Element nachträglich geben kann. Mittels Blend geht dies sogar ohne Programmieren, einfach durch Drag&Drop. Das folgende Bild zeigt die neue Asset-Bibliothek in Blend 3.
Um ein Behavior auf ein Element anzuwenden, zieht man dieses einfach per Drag&Drop aus der Asset-Library auf das entsprechende Control.
Und schon hat das Control (_imageGrid) die Mouse3DBehavior-Eigenschaften.
Anbei der Code für das Mouse3DBehavior, welches ich in meiner kleinen Bildergalerie verwende. Damit läßt sich nun jedes Control mit der Maus dreidimensional Bewegen. Einfach die linke Maustaste drücken und die Maus bewegen.
Anbei der Code für das Mouse3DBehavior.
1: public class Mouse3DBehavior : Behavior<UIElement>
2: {
3: PlaneProjection _planeProjection;
4: bool _buttonPressed = false;
5: Point _originPoint;
7: protected override void OnAttached()
9: base.OnAttached();
10:
11: _planeProjection = new PlaneProjection();
12: this.AssociatedObject.Projection = _planeProjection;
13:
14: (new MouseWheelHelper(this.AssociatedObject as FrameworkElement)).Moved += new System.EventHandler<MouseWheelEventArgs>(Mouse3DBehavior_Moved);
15:
16: this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
17: this.AssociatedObject.MouseLeftButtonUp += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
18: this.AssociatedObject.MouseMove += new MouseEventHandler(AssociatedObject_MouseMove);
19: this.AssociatedObject.MouseLeave += new MouseEventHandler(AssociatedObject_MouseLeave);
20:
21: this.AssociatedObject.KeyUp += new KeyEventHandler(AssociatedObject_KeyUp);
22: this.AssociatedObject.KeyDown += new KeyEventHandler(AssociatedObject_KeyDown);
23: }
24:
25: bool _shiftPressed = false;
26:
27: void AssociatedObject_KeyDown(object sender, KeyEventArgs e)
28: {
29: if (e.Key == Key.Shift)
30: {
31: _shiftPressed = true;
32: }
33: }
34:
35: void AssociatedObject_KeyUp(object sender, KeyEventArgs e)
36: {
37: _shiftPressed = false;
38: }
39:
40: void Mouse3DBehavior_Moved(object sender, MouseWheelEventArgs e)
41: {
42: if (_buttonPressed)
43: {
44: _planeProjection.LocalOffsetZ += e.Delta * 10;
45: this.AssociatedObject.Projection = _planeProjection;
46: }
47: }
48:
49: void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
50: {
51: _buttonPressed = false;
52: }
53:
54: void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
55: {
56: _originPoint = GetPoint(e);
57: _buttonPressed = true;
58: }
59:
60: void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
61: {
62: _buttonPressed = false;
63: }
64:
65: void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
66: {
67: if (_buttonPressed)
68: {
69: Point p = GetPoint(e);
70:
71: double diffX = p.X - _originPoint.X;
72: double diffY = p.Y - _originPoint.Y;
73:
74: _planeProjection.RotationY += diffX / 10;
75: _planeProjection.RotationX += diffY / 10;
76: this.AssociatedObject.Projection = _planeProjection;
78: _originPoint = p;
79: }
80: }
81:
82: private Point GetPoint(MouseEventArgs e)
83: {
84: return e.GetPosition(this.AssociatedObject);
85: }
86:
87: protected override void OnDetaching()
89: base.OnDetaching();
90:
91: this.AssociatedObject.Projection = null;
92:
93: this.AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
94: this.AssociatedObject.MouseLeftButtonUp -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
95: this.AssociatedObject.MouseMove -= new MouseEventHandler(AssociatedObject_MouseMove);
96: }
Damit das ganze funktioniert muss man noch die Microsoft.Expression.Interactivity bzw. System.Windows.Interactivity einbinden. Diese liegt in einem Unterordner von Expression bzw. dem SDK.
Ich habe vor einigen Tagen eine sehr nette Anwendung zum Betrachten von Fotos im Browser gesehen. Der Nachtteil bei der Anwendung war allerdings, das man vorher ein spezielles Plug-In (weder Flash noch Silverlight) installieren musste um sich das ganze zu Betrachten. Außerdem war es sehr groß … :(
Das geht leichter und einfacher und noch viel dynamischer dachte ich mir und habe deshalb mal ein eigenes Container-Control (ImageGrid) erstellt.
Schritt 1: Ableiten von der richtigen Klasse –> Panel
1: public class ImageGrid : Panel
3: protected override Size ArrangeOverride(Size finalSize)
4: {
5: double imageWidth = (double)this.GetValue(ImageWidthProperty);
6: double imageHeight = (double)this.GetValue(ImageHeightProperty);
7: int rowsPerColumn = (int)this.GetValue(RowsPerColumnProperty);
8: double imageMargin = (double)this.GetValue(ImageMarginProperty);
9:
10: int currentRow = 0;
11: int currentColumn = 0;
12:
13: foreach (Image image in this.Children.OfType<Image>())
14: {
15: Hover3DBehavior behavior = new Hover3DBehavior();
16: behavior.ZHoverValue = (double)this.GetValue(ZHoverValueProperty);
17: behavior.Attach(image);
18:
19: if ((bool)this.GetValue(ShowShadowProperty))
20: {
21: DropShadowEffect ds = new DropShadowEffect();
22: ds.Opacity = .3;
23: ds.BlurRadius = 10.0;
24: ds.Direction = 0.0;
25: ds.ShadowDepth = 20.0;
26: image.Effect = ds;
28:
29: Rect rect = new Rect(
30: currentColumn * (imageWidth + imageMargin),
31: currentRow * (imageHeight + imageMargin),
32: imageWidth,
33: imageHeight);
35: image.Width = imageWidth;
36: image.Height = imageHeight;
37: image.Arrange(rect);
38: image.InvalidateArrange();
40: currentRow++;
41: if (currentRow >= rowsPerColumn)
42: {
43: currentRow = 0;
44: currentColumn++;
45: }
47:
48: Size newSize = new Size((currentColumn+1) * (imageWidth + imageMargin), rowsPerColumn * (imageHeight+imageMargin));
49:
50: return base.ArrangeOverride(newSize);
51: }
Schritt 2: Erweitern mit netten Eigenschaften zum Konfigurieren
1: private const int C_DefaultRowsPerColumn = 5;
2: private const double C_DefaultImageWidth = 160.0;
3: private const double C_DefaultImageHeight = 120.0;
4: private const double C_DefaultZHover = 200.0;
5: private const bool C_DefaultShowShadow = true;
6: private const double C_DefaultImageMargin = 8.0;
7:
8: #region Images per column
10: public int RowsPerColumn
11: {
12: get { return (int)GetValue(RowsPerColumnProperty); }
13: set { SetValue(RowsPerColumnProperty, value); }
14: }
16: public static readonly DependencyProperty RowsPerColumnProperty =
17: DependencyProperty.Register("RowsPerColumn", typeof(int),
18: typeof(ImageGrid),
19: new PropertyMetadata(C_DefaultRowsPerColumn,
20: new PropertyChangedCallback(OnImageSizeChanged)));
21:
22: #endregion
23:
24: #region Image Width
25:
26: public double ImageWidth
27: {
28: get { return (double)GetValue(ImageWidthProperty); }
29: set { SetValue(ImageWidthProperty, value); }
30: }
31:
32: public static readonly DependencyProperty ImageWidthProperty =
33: DependencyProperty.Register("ImageWidth", typeof(double),
34: typeof(ImageGrid),
35: new PropertyMetadata(C_DefaultImageWidth,
36: new PropertyChangedCallback(OnImageSizeChanged)));
37:
38: #endregion
40: #region Image Margin
41:
42: public double ImageMargin
44: get { return (double)GetValue(ImageMarginProperty); }
45: set { SetValue(ImageMarginProperty, value); }
48: public static readonly DependencyProperty ImageMarginProperty =
49: DependencyProperty.Register("ImageMargin", typeof(double),
50: typeof(ImageGrid),
51: new PropertyMetadata(C_DefaultImageMargin,
52: new PropertyChangedCallback(OnImageSizeChanged)));
54: #endregion
55:
56: #region Image Height
57:
58: public double ImageHeight
59: {
60: get { return (double)GetValue(ImageHeightProperty); }
61: set { SetValue(ImageHeightProperty, value); }
62: }
63:
64: public static readonly DependencyProperty ImageHeightProperty =
65: DependencyProperty.Register("ImageHeight", typeof(double),
66: typeof(ImageGrid),
67: new PropertyMetadata(C_DefaultImageHeight,
68: new PropertyChangedCallback(OnImageSizeChanged)));
69:
70: protected static void OnImageSizeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
71: {
72: ImageGrid i = obj as ImageGrid;
73: i.InvalidateArrange();
74: }
75:
76: #endregion
78: #region ZHoverValue
79:
80: public double ZHoverValue
81: {
82: get { return (double)GetValue(ZHoverValueProperty); }
83: set { SetValue(ZHoverValueProperty, value); }
84: }
85:
86: public static readonly DependencyProperty ZHoverValueProperty =
87: DependencyProperty.Register("ZHoverValue", typeof(double), typeof(ImageGrid),
88: new PropertyMetadata((double)C_DefaultZHover, null));
89:
90: #endregion
91:
92: #region Show Shadow
94: public bool ShowShadow
95: {
96: get { return (bool)GetValue(ShowShadowProperty); }
97: set { SetValue(ShowShadowProperty, value); }
98: }
100: public static readonly DependencyProperty ShowShadowProperty =
101: DependencyProperty.Register("ShowShadow", typeof(bool), typeof(ImageGrid),
102: new PropertyMetadata((bool)C_DefaultShowShadow, new PropertyChangedCallback(OnImageSizeChanged)));
103:
104: #endregion
Schritt 4: Erstellen eines Hover-Effektes mithilfe eines Behaviors
1: public class Hover3DBehavior : Behavior<UIElement>
4:
5: public Hover3DBehavior()
6: : base()
7: {
8:
9: }
11: Storyboard _hoverMe;
12: Storyboard _unhoverMe;
14: private const double C_DefaultHoverValue = 500.0;
16: #region ZHoverValue
18: public double ZHoverValue
19: {
20: get { return (double)GetValue(ZHoverValueProperty); }
21: set { SetValue(ZHoverValueProperty, value); }
22: }
24: public static readonly DependencyProperty ZHoverValueProperty =
25: DependencyProperty.Register("ZHoverValue", typeof(double), typeof(Hover3DBehavior),
26: new PropertyMetadata((double)C_DefaultHoverValue, null));
27:
28: #endregion
30: #region Overrides
32: protected override void OnAttached()
33: {
34: base.OnAttached();
36: _planeProjection = new PlaneProjection();
37: this.AssociatedObject.Projection = _planeProjection;
38:
39: if (!DesignerProperties.GetIsInDesignMode(this))
41: _hoverMe = new Storyboard();
42:
43: DoubleAnimation da1 = new DoubleAnimation();
44:
45: _hoverMe.Children.Add(da1);
46: da1.Duration = new Duration(new System.TimeSpan(0, 0, 0, 0, 300));
47: da1.To = this.ZHoverValue;
48: Storyboard.SetTarget(da1, this.AssociatedObject);
49: Storyboard.SetTargetProperty(da1, new PropertyPath("(UIElement.Projection).(PlaneProjection.LocalOffsetZ)"));
50:
51: DoubleAnimation da2 = new DoubleAnimation();
52: BounceEase be2 = new BounceEase();
53: be2.EasingMode = EasingMode.EaseOut;
54: be2.Bounces = 3;
55: da2.EasingFunction = be2;
56:
57: _unhoverMe = new Storyboard();
58: _unhoverMe.Children.Add(da2);
59: da2.Duration = new Duration(new System.TimeSpan(0, 0, 0, 0, 1000));
60: da2.To = 0.0;
61: Storyboard.SetTarget(da2, this.AssociatedObject);
62: Storyboard.SetTargetProperty(da2, new PropertyPath("(UIElement.Projection).(PlaneProjection.LocalOffsetZ)"));
64: if ((this.AssociatedObject as FrameworkElement).Resources.Contains("hoverme"))
65: {
66: (this.AssociatedObject as FrameworkElement).Resources.Remove("hoverme");
67: }
68: (this.AssociatedObject as FrameworkElement).Resources.Add("hoverme", _hoverMe);
70: if ((this.AssociatedObject as FrameworkElement).Resources.Contains("unhoverme"))
72: (this.AssociatedObject as FrameworkElement).Resources.Remove("unhoverme");
73: }
74: (this.AssociatedObject as FrameworkElement).Resources.Add("unhoverme", _unhoverMe);
76:
77: this.AssociatedObject.MouseEnter += new MouseEventHandler(AssociatedObject_MouseEnter);
78: this.AssociatedObject.MouseLeave += new MouseEventHandler(AssociatedObject_MouseLeave);
80:
81: protected override void OnDetaching()
82: {
83: base.OnDetaching();
84:
85: this.AssociatedObject.Projection = null;
86: _planeProjection = null;
87:
88: this.AssociatedObject.MouseEnter -= new MouseEventHandler(AssociatedObject_MouseEnter);
89: this.AssociatedObject.MouseLeave -= new MouseEventHandler(AssociatedObject_MouseLeave);
90: }
92: #endregion
94: #region Events
95:
96: void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
97: {
98: _unhoverMe.Begin();
99: }
100:
101: void AssociatedObject_MouseEnter(object sender, MouseEventArgs e)
102: {
103: _hoverMe.Begin();
104: }
105:
106: #endregion
107:
Schritt 3: Verwenden in Blend
Das ImageGrid nach dem ich einige Beispielbilder reingesetzt habe.
Der Arbeitsbereich
Der VisualTree.
Die zusätzlichen Konfigurationsmöglichkeiten.
Mit dem kostenlosen Visual Web Developer Express mit ServicePack ist auf jeden Fall Silverlight-Entwicklung möglich: http://www.microsoft.com/germany/express/product/visualwebdeveloperexpress.aspx
Im deutschsprachigen Silverlight-Developer-Center gibt’s haufenweise Infos zu Silverlight-Entwicklung: http://msdn.microsoft.com/de-de/silverlight/default.aspx
Meine zehnteilige Video-Einführung in SL2: http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-0806-01.mspx
Das SDK ist hier: http://silverlight.net/GetStarted/ (englisch)
Die erste Xtopia [kompakt]-Roadshow rund um die Themen Web/UX und Rich Internet Applications war ein voller Erfolg. Von April bis Mai 2009 waren wir mit Microsoft und anderen hochkarätigen Partnern auf der Xtopia im Kleinformat unterwegs: In München, Karlsruhe, Hamburg, Köln, Berlin und Frankfurt erlebten jeweils bis zu 100 Teilnehmer Vorträge und Demos zu den Themen Web, User Experience und Silverlight/Rich Internet Applications.
Wenn Sie in diesem Jahr keine Zeit hatten, bei Xtopia [kompakt] dabei zu sein, finden Sie auf der Website der Xtopia [kompakt] ab sofort (fast) alle Vorträge als PDF, viele Videos und umfangreiche Informationen rund um die Inhalte der vergangenen Roadshow. Im Mittelpunkt stehen Microsoft Surface, Windows 7, Silverlight 3 und Internet Explorer 8. Partner wie PC-Ware und das deutsche RIA-Forum begleiteten uns auf der Roadshow. Agenturen aus der Design- und Webbranche ergänzten die Vorträge mit Erfahrungsberichten zu Design, User Experience, Rich Internet Applications und Webentwickung. Beispielsweise zeigte CRM-Spezialist CAS in einem Vortrag die Vorteile von Silverlight gegenüber AJAX und Flash bei der Entwicklung professioneller Unternehmensanwendungen auf. Weitere Erfahrungsberichte kamen von Quark, Ergosign, maximago, Pixelpark AG, T-Systems MMS, UID, Perun.net und Sensory Minds.
Hier entlang zu den gesammelten Präsentationen der XTOPIA [kompakt] 09 und den Session-Videos: http://blogs.msdn.com/riablog/archive/2009/06/09/xtopia-kompakt-09-videos-und-vortr-ge-jetzt-als-download-verf-gbar.aspx bzw. http://snipurl.com/jtiex
Mein Kollege Dr. Mobile aka Frank Prengel hat gerade einen sehr umfangreichen Artikel über die Entwicklung von Anwendungen für mobile Endgeräte mit Windows Mobile 6.x geschrieben. Sehr lesenswert.
http://blogs.msdn.com/frankpr/archive/2009/06/09/software-f-r-windows-mobile-6-x-entwickeln-wie-fange-ich-an.aspx
Das Windows 7 Team stellt in einen sehr interessanten Artikel das Touch Pack für Windows 7 vor.
http://windowsteamblog.com/blogs/windows7/archive/2009/05/27/introducing-the-microsoft-touch-pack-for-windows-7.aspx
In diesem ersten Teil unserer Silverlight3-Serie "Druckbetankung - Die Show" geht es um Grundsätzliches, von den Voraussetzungen für Silverlight 3, über die Installation zu der neuen Features. Ausserdem installieren und zeigen ein paar Details der Blend 3 Preview, zum Beispiel die dort integrierte IntelliSense-Unterstützung. Alles zum Ausprobieren und Nachmachen, wie immer auf unterhaltsame Art präsentiert von Oliver Scheer und meiner Wenigkeit.
Druckbetankung - Die Show -- Silverlight 3 Teil I
Im zweiten Teil unserer Staffel Silverlight 3 der Serie "Druckbetankung - Die Show" (ihr seht, wir haben uns Gedanken gemacht, wie das richtige Wording aussehen soll (= ) seht ihr die Navigation Templates, die neu in Silverlight 3 sind. Navigation Templates vereinfachen das Konzept der Seitentransparenz in Silverlight, so dass einzelne Inhalte einer Silverlight-Applikation auch per URL angesteuert werden und von Suchmaschinen so direkt indiziert werden können. Wie das Ganze funktioniert und wo noch weitere Vorteile liegen erfahrt ihr im Video!
Druckbetankung - Die Show -- Silverlight 3 Teil II
Der dritte Teil unserer Silverlight 3 Staffel der Serie Druckbetankung befasst sich mit der Out-of-Browser-Funktionalität, die in Silverlight 3 neu hinzugekommen ist. Diese ermöglicht es dem User, eine Web-Silverlight-Applikation auf dem Desktop bzw. lokal auf dem PC abzulegen, und von dort wie gewohnt zu verwenden, ohne dass ein Browser involviert ist. Oliver Scheer und ich zeigen, wie man seine Applikation Out-of-Browser-Ready macht, und welche zusätzlichen Möglichkeiten der Programmierung dadurch möglich werden. Wir zeigen, wie man der Applikation beibringt zu wissen, ob sie im Browser oder lokal läuft und wie man den Onlinestatus überprüft.
Druckbetankung - Die Show -- Silverlight 3 Teil III
Im vierten Teil unserer Staffel Silverlight 3 der Serie "Druckbetankung - Die Show" erklären Oliver Scheer und ich das Thema Animation und Storyboarding in Expression Blend 3. Ausserdem kommt das Thema "Easing Functions" zur Sprache. Easing Functions erleichtern dank vorgegebener Bewegungsabläufe die natürliche Animation von Objektbewegungen.
Druckbetankung - Die Show -- Silverlight 3 Teil IV
Im fünften Teil der Staffel Silverlight 3 aus der Serie "Druckbetankung - Die Show" geht es um das Binden von Elementeigenschaften an die Werte der Eigenschaften anderer Elemente. Das Sogenannte Element-to-Element Binding ist dafür verantwortlich, dass man in Silverlight mit Hilfe eines Sliders beispielsweise die Darstellungsgröße eines Textes verändern kann. An einem praktischen Beispiel zeigen Oliver Scheer und ich wie diese Technik verwendet wird.
Druckbetankung - Die Show -- Silverlight 3 Teil V
In Teil sechs der Staffel Silverlight 3 aus der Serie "Druckbetankung - Die Show" dreht sich alles um die Plane Projection, die 3D-Projektion in Silverlight 3. Diese Projektion lässt sich sowohl in Expression Blend 3 verändern, als auch an Eingabefelder, beispielsweise Slider, binden und so in der Anwendung selber interaktiv verändern. Oliver Scheer und ich programmieren uns explorativ durch die Möglichkeiten der 3D-Projektion.
Druckbetankung - Die Show -- Silverlight 3 Teil VI
Im ersten Teil unseres neuen Formates "Druckbetankung - Die Show" erzählen Oliver Scheer und ich alles über Silverlight 2. Alles? Nicht ganz, aber wir fangen bei den Basics an, zeigen, welche Voraussetzungen man für die Silverlight-Entwicklung benötigt, wo Stolpersteine liegen könnten und wie man zu seiner ersten Silverlight Applikation kommt und diese auf seiner Seite einbindet. In den kommenden Teilen wird dieses Wissen dann vertieft bis zur Datenbindung und zum Cross-Domain-Access. Ausserdem seht ihr das Zusammenspiel zwischen Visual Studio 2008 und Expression Blend 2 SP1.
Druckbetankung - Die Show -- Silverlight Teil I
Im zweiten Teil der Silverlight-Serie "Druckbetankung - Die Show" bauen Oliver Scheer und ich einen RSS-Reader in Expression Blend 2 SP1 und Visual Studio. Was muss so ein Silverlight RSS-Reader können? Und wie kann man das mit wenig Code umsetzen? Am Ende haben wir ein funktionales, wenn auch nicht unbedingt schönes Grundgerüst mit Cross-Domain-Zugriff per WebService aus der Windows Communication Foundation (WCF), interaktiver Suche per Language Integrated Query (LINQ) und Datenbindung der Ergebnisse an eine ListBox.
Druckbetankung - Die Show -- Silverlight Teil II
In Teil 3 unserer Serie "Druckbetankung - Die Show" geht es um Beautifying, Templates, Ressourcen, Styling und Skinning. Oliver Scheer und ich haben in den vorangegegangenen Webcasts bereits eine fertige Anwendung aus Entwicklersicht gebaut, denn alle wichtigen Funktionen sind integriert. Aber so richtig benutzbar und schön ist das Ganze noch nicht. Also nochmal ran mit Expression Blend und die Anwendung mit eigens entworfenen Buttons, einem animierten UserControl für die Zeit des Nachladens und ein paar Farbverläufe sollten auch noch drin sein.
Druckbetankung - Die Show -- Silverlight Teil III
Mein Kollege hat einige sehr interessante Beiträge zum Theme Suchmaschinenoptimierung / Search Engine Optimization/SEO veröffentlich.
http://blogs.msdn.com/waldred/archive/2009/03/23/Search-Engine-Optimization-for-Silverlight-Applications.aspx
http://blogs.msdn.com/waldred/archive/2009/03/24/search-engine-optimization-for-silverlight-applications-part-2.aspx
Zusätzlich gibt es seit einigen Tagen im Web PI (Microsoft Web Platform Installer) kostenfrei ein SEO-Toolkit für den IIS. Link: Microsoft Web Platform
Derzeit (Silverlight 3) ist es nicht direkt möglich HTML in Silverlight direkt darzustellen. Allerdings kann man sich mittels HTML und einem DIV über dem Silverlight-Control einfach behelfen.
Allerdings kann man sich auch den unten folgenden Links bedienen um eben Text mit HTML-formatiert in Silverlight direkt einzubinden.
http://www.vectorlight.net/tutorials/rendering_html_in_silverlight_2.aspx
http://blogs.msdn.com/delay/archive/2007/09/10/bringing-a-bit-of-html-to-silverlight-htmltextblock-makes-rich-text-display-easy.aspx
https://www.componentone.com/SuperProducts/HtmlHostSilverlight/
Dieses Posting ist für alle interessierten Webmaster gedacht, aber auch für mich selbst, um bei erneuten Anfragen zur Content-Syndication bezüglich Inhalte von meinem Weblog, darauf zu referenzieren. Für ausgewählte Bereiche des MSDN Online-Portals in Deutschland stehen ja schon seit einiger Zeit RSS-Feeds zur Verfügung, die automatisch über neue Inhalte informieren. Dabei erhält man nicht nur werktäglichen News, sondern auch Infos zu technischen Ressourcen wie Webcasts, CodeClips, Artikel oder Bücher sowie zu Veranstaltungen. Mit dem neuen MSDN RSS Konfigurator lassen sich problemlos in wenigen Schritten diese Inhalte auf Webseiten integrieren und anzeigen. Seit einigen Tagen ist nun dort auch mein Weblog gelistet. Da ich doch öfters mal die Frage bekomme, ob man z.B. den RSS-Feed meines Weblogs woanders darstellen darf, hier nun die offizielle Antwort: Wenn man den MSDN RSS Konfigurator dafür nutzt, darf man dies sehr gerne und ich würde mich sehr freuen, wenn man diese Art der Content-Syndication nutzen würde. Fragen zum Konfigurator oder Feedback können auf MSDN Online im Forum gestellt und diskutiert werden.
Wer gerne mal in den Sternenhimmel guckt, der ist hier richtig aufgehoben.
Link: http://www.worldwidetelescope.org/webclient/
Die Sparkasse Duisburg sucht derzeit das “Sparkassengesicht 2009”. Und das mit einer sehr netten Silverlight-Anwendung.
Live zu sehen unter: http://www.sparkassengesicht.de/Voting.html
Meine Kollegen Jamie Rodriguez und Adam Kinnley haben mit Experten aus der Industrie eine kleine Videoreihe erstellt. In dieser werden Fragen zum Thema “Wie strukturiert man am besten seine XAML-basierte Anwendungen”.
Teil 1: http://channel9.msdn.com/shows/Continuum/XAML-Guidelines-Part-1/
Teil 2: http://channel9.msdn.com/shows/Continuum/XAML-Guidelines-Part-2/