Archive for the ‘Development’ Category
Wizardy w AERO
W viście są dosyć fajnie dopracowane kontrolki – to już wiecie. Moją szczególną uwagę zwróciły wizardy w aero, taki jak na przykład przy dodawaniu nowej drukarki:
To co głównie wyróżnia tego wizarda to przycisk wstecz w lewym górnym rogu i olbrzymi pasek tytułowy ( jak na mój gust nawet za duży).
Szukałem sposobu w jaki by można zrobić takiego wizarda we własnej aplikacji, który byłby zgodny z systemowym. Okazuje się, że istnieje nawet przykład, który pokazuje jak to zrobić w .NET, oczywiście jak zwykle w msdnie sprawa nie jest banalna i wpierw należy pobrać Vista Bridge Controls. Po skompilowaniu wszystkiego możemy zacząć używać fajnych aero wizardów w WPF:
Zrobienie czegoś takiego wymaga dosyć prostego xamla:
<v:AeroWizard x:Class="Wizard.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:v="clr-namespace:Microsoft.SDK.Samples.VistaBridge.Controls;assembly=VistaBridgeControls"
xmlns:l="clr-namespace:Wizard"
MainInstruction="AERO Wizard Test"
Title="Connect to a workplace"
>
<v:AeroWizard.Pages>
<Page>
<StackPanel>
<v:CommandLinkWPF Link="Choice One" Note="(Recommended)" Click="OnClick" />
<v:CommandLinkWPF Link="Choice Two" Note="(Not Recommended)" Click="OnClick" />
<v:CommandLinkWPF Link="Choice Three" Note="(Never Use)" />
</StackPanel>
</Page>
<Page>
<StackPanel>
<v:CommandLinkWPF Link="Some Other Link text" Note="This is a lot of descriptive text, which will enable the user to make a better choice." Click="OnClick" />
</StackPanel>
</Page>
</v:AeroWizard.Pages>
</v:AeroWizard>
Bardzo poważna wadą takiego rozwiązania to że będzie działać jedynie na Viście, na xp pojawi się komunikat o braku biblioteki dwmapi.dll. Żeby rozwiązać problem trzeba by napisać własną abstrakcję wizarda, która na viscie używałaby aero a na xp jakiegoś domyślnego wyglądu.
[EN] WPF: Ribbon in Prism Applications
Microsoft some time ago published its Ribbon(known from Office 2007) control library for Windows Presentation Foundation. However it turns out that obtaining this library is quite burdensome:
- You have to go to a “Office UI Licensing” site and use “License the Office UI”, next you have to login with your Live Id and accept license agreement. Frankly I have no idea what have I agreed to
at the end you will be able to download WPFRibbonCTP, which contains ribbon control. - I also strongly suggest to download Hands-On-Lab: What’s Coming in WPF:Datagrid, Ribbon and VSM which contains a great tutorial on how to use ribbon in your application. In exercise 2 there is a great app with ribbon which looks like this:
![image1[1] image1[1]](http://bartekszafko.pl/wp-content/uploads/2008/11/image11.png)
Using Ribbon in Prism
We had a talk on Prism on 12. Poznan .NET User Group Meeting. Szymon Kobalczyk gave a great talk on using Composite Application Library ( aka Prism ) to build great WPF applications. His presentation was very inspiring and gave me a kick-start into Prism. I decided to go on and use ribbon in prism. After some code reading it turned out that I just needed a custom RegionAdapter:
public class RibbonControlRegionAdapter : RegionAdapterBase<Ribbon>
{
private Ribbon m_regionTarget;
protected override void Adapt(IRegion region, Ribbon regionTarget)
{
m_regionTarget = regionTarget;
regionTarget.Tabs.Clear();
region.ActiveViews.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(OnActiveViewsChanged);
foreach ( RibbonTab v in region.ActiveViews)
regionTarget.Tabs.Add(v);
}
private void OnActiveViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (RibbonTab v in e.NewItems)
m_regionTarget.Tabs.Add(v);
break;
case NotifyCollectionChangedAction.Remove:
foreach (RibbonTab v in e.NewItems)
m_regionTarget.Tabs.Remove(v);
break;
}
}
protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
}
Here is what shell aplication looks like before enabling a test module ( I know ugly, but it’s not the point:P ):

This is how shell application looks like after enabling module1:

Further development
In this example custom region adapter is built in such way that it only allows you to add whole new tabs to ribbon. You can image an adapter that does reparenting and allows you to add regions even in tabs itself or items to main menu.
O wstążce w pryzmacie ( Ribbon + Prism)
Wstążka (Ribbon)
Jakiś czas temu Micorosoft opublikował biblioteki ze wstążką znane z Office 2007 pozwalające na użycie w aplikacjach WPF. Okazuje się, że uzyskanie tych bibliotek wymaga jednak trochę zachodu:
- Trzeba się udać na stronę “Office UI Licensing” i skorzystać z linku “License the Office UI”, następnie trzeba się zalogować przy pomocy live Id i zaakceptować licencję. Przyznam się szczerze, że nawet nie wiem na co się zgodziłem
Na końcu tego kroku będzie można pobrać WPFRibbonCTP – bibliotekę ze wstążką dla WPF. - Najlepiej też pobrać Hands-On-Lab:What’s Coming in WPF: Datagrid, Ribbon, and VSM, który pokazuje jak stworzyć wstążkę. W ćwiczeniu 2 zawarta jest świetna aplikacja demonstracyjna:

Podłączamy Prism
O Prism opowiadał Szymon Kobalczyk na 12. spotkaniu PG .NET – jego wystąpienie zainspirowało mnie i zachęciło do eksperymentów. Postanowiłem dodać region pozwalający na dodawanie zakładek do wstążki przez moduły. Po bliższym obejrzeniu kodu źródłowego Prisma okazało się, że trzeba tylko stworzyć własny RegionAdapter:
public class RibbonControlRegionAdapter : RegionAdapterBase<Ribbon>
{
private Ribbon m_regionTarget;
protected override void Adapt(IRegion region, Ribbon regionTarget)
{
m_regionTarget = regionTarget;
regionTarget.Tabs.Clear();
region.ActiveViews.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(OnActiveViewsChanged);
foreach ( RibbonTab v in region.ActiveViews)
regionTarget.Tabs.Add(v);
}
private void OnActiveViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (RibbonTab v in e.NewItems)
m_regionTarget.Tabs.Add(v);
break;
case NotifyCollectionChangedAction.Remove:
foreach (RibbonTab v in e.NewItems)
m_regionTarget.Tabs.Remove(v);
break;
}
}
protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
}
Tak wygląda shell przed podłączeniem modułu ( wiem – brzydki, ale nie o to chodzi:P ):

A tak po włączeniu modułu Module1, który używa regionu we wstążce:

Rozwój
W tym przykładzie adapter jest tak zbudowany, że pozwala tylko na dodawanie całych zakładek. Można sobie wyobrazić sytuację, w której na istniejących już zakładkach można dodawać nowe przyciski/grupy/menu lub nawet nowe pozycje do głównego menu.
Speaker Idol na MTS 2008
Wczoraj się dowiedziałem, że już w środę 8 października będę miał okazję wziąć udział w konkursie speaker idol na Microsoft Technology Summit.
Tematem mojego wystąpienia będzie ASP .NET MVC, o którym napisałem trochę postów.
Każda z osób występująca 8 października ma tylko 3 minuty – więc trzeba się bardzo dobrze przygotować
Drugiego dnia ma się do dyspozycji aż
5 minut.
Tajemnicą pozostaje na razie kto znajdzie się w jury, może Kuba Wojewódzki
Wsród osób, które przeszły do dalszego etapu konkursu są moi znajomi – osoby działające w siostrzanych grupach microsoftowych w całej polsce min:
- Karol Stilger
- Michał Jagieła
- Łukasz Foks
Trzymajcie kciuki za wszystkich
PS. Pisano o tym także na codeguru, a więcej informacji o konkursie na stronach konferencji.
Prototypowanie

W elektronice bardzo często buduje się prototypy przy pomocy bardzo prostych narzędzi: płycie nazywanej bread bordem, kilku kabelków i paru elementów. W ten sposób można sprawdzić działanie układu – tak jak na zdjęciu powyżej zbudowany został model zegara binarnego.
Podobne podejście opłaca się stosować także podczas tworzenia oprogramowania. Gdy po raz pierwszy używasz nowej technologii, biblioteki lub wprowadzasz nieznany wcześniej element warto zbudować proste rozwiązanie pozwalające na zapoznanie się z działaniem i specyfiką nowego składnika.
Istnieje kilka prostych zasad, których stosowanie znacznie ułatwia prototypowanie:
- wyeliminuj wszystkie zależności – sprawdzaj tylko jedną rzecz(zagadnienie), zbyt wiele ruchomych części utrudni Ci namierzenie ewentualnych problemów
- nie przejmuj się czystością kodu, architekturą – po prostu sprawdź jak coś działa
- nie oczekuj, że coś zrobisz z prototypem po zakończeniu eksperymentu; prototyp powinien pójść do śmietnika, a to co zyskałeś powinno zostać w Twojej głowie, lub w formie opracowania(zależy jak ścisły proces stosujesz)
- pamiętaj, że celem jest ograniczenie ryzyka związanego z nie przewidzianymi problemami oraz umożliwienie dokładniejszej estymacji czasu potrzebnego na realizacje zadania
Prototypowanie jest zalecane w metodyce XP, ale moim zdaniem każdy może dzięki temu zyskać.
MSBuild Community Tasks – wszystko czego brakuje w MSBuild
http://msbuildtasks.tigris.org/ to ciekawy projekt dodający taski do msbuilda pozwalające wykonywać naprawdę interesujące rzeczy podczas budowania projektów i co dla mnie najważniejsze bez dużego nakładu pracy. Taski, które szczególnie zwróciły moją uwagę to:
- XmlMassUpdate – pozwala na wykonywanie zmian w plikach xml, można go użyć np do zmiany plików .config w zależności od konfiguracji builda
- SvnInfo – pobieranie revision z repoytorium subversion
Hackfest
Barcampowcy wysmarzyli kolejny event: tym razem 24 godzinny konkurs na programowanie aplikacji webowych( 5 – 6 września).
Warto zauaważyć, że jest do wyboru środowisko ASP .NET. Rejestracja tylko do 31 sierpnia.
Niestety nie wiem, ile do tej pory drużyn wybrało .NET. Mam nadzieję, że będę miał okazję zapewnić wsparacie/stworzenie(?) środowiska dla developerów.
Mój harmonogram MTS 2008

¦roda
07:30 – 09:30 Rejestracja
09:30 – 11:00 Sesja generalna (otwierająca)
11:00 – 11:20 Przerwa kawowa
11:20 – 12:35 Wydajne aplikacje ASP.NET w świecie Web 2.0 Tymoteusz Chmielewski
12:35 – 13:35 Lunch
13:35 – 14:50 Praktyczne aspekty budowania rozwiazań klasy Enterprise z wykorzystaniem produktów Microsoft Patterns and Practices Marcin Sieradzki
14:50 – 15:10 Przerwa kawowa
15:10 – 16:25 .NET bez wizardów ? sposoby tworzenia i dynamicznego aktywowania komponentów w aplikacjach Bartosz Pampuch
16:25 – 16:45 Przerwa kawowa
16:45 – 18:00 TFS – praktyka Bartosz Celmer
Czwartek
07:30 – 09:00 Rejestracja
09:00 – 10:15 Bezpieczeństwo serwisów WWW ? praktyczne uwagi o implementacji zaleceń DBTI ABW w ASP.NET Zbigniew Łapiński
10:15 – 10:35 Przerwa kawowa
10:35 – 11:50 Integrating Windows Presentation Foundation and Windows Communication Foundation into Your Office Business Applications Tim Huckaby
11:50 – 12:50 Lunch
12:50 – 14:05 Build great software with Rosario tools Michael Juřek
14:05 – 14:25 Przerwa kawowa
14:25 – 15:40 Testy w Microsoft Visual Studio Team System 2008 Artur Jedynak
15:40 – 16:00 Sesja generalna (zamykająca)
Niestety sesja Bartka Pampucha koliduje z równie ciekawą sesją Szymona Kobalczyka o aplikacjach biznesowych w WPF
mam nadzieję, że będzie można zobaczyć materiały wideo.
Integracja Trac z Visual Studio
Traca chyba nie trzeba chyba specjalnie reklamować. Jest to świetny webowy system do prowadzenia projektów, zawiera w sobie wiki oraz bug-trackera.
Jedynej rzeczy, której szczerze mówiąc brakowało to możliwość integracji z visual studio. Okazuje się, że istnieje projekt VsTrac, który pozwala na podłączanie się do Traca z poziomu visual studio. Całość wygląda podobnie do team explorera z tfs, ale oczywiście jest za darmo. Sam projekt jest dopiero we wczesnej fazie rozwoju, więc ma pewne ostre krawędzie, mimo to da się go używać. Poniżej kilka screenshotów.



Tworzenie aplikacji webowych
Ostatnio zastanawiałem się nad tworzeniem aplikacji webowych, w szerszym zakresie niż tylko język programowania. Element, który moim zdaniem jest niezbędny do prawidłowego funkcjonowania to CMS ( lub szerzej serwer aplikacji webowych). Według mnie budowanie aplikacji webowej w ramach takiego serwera aplikacji ( lub systemu cms) może znacznie skrócić czas realizacji. Prawdopodobnie nie będziemy musieli martwić się o tworzenie mechanizmów rejestracji, logowania czy przypominania hasła. Dodatkowym zyskiem jest zapewnienie przez CMS mechanizmu do obsługi treści statycznych. Treści statyczne to ważna część aplikacji webowej. Z reguły zawiera rzadko zmieniające się informacje np.: pomoc, opis formularzy, polityki prywatności lub regulaminy. Dostęp do tych części od strony administracyjnej z reguły mają osoby niezbyt “techniczne” i oczekują łatwej możliwości edycji ( bez konieczności odpalania np visual studio lub vi i grzebania w htmlu) koniecznie za pomocą edytora WYSIWYG. Z reguły tworzenie takich mechanizmów mocno wykracza poza zakres projektu lub zapomina się o nich i w ogóle nie zostają uwzględnione.
Przyglądając się bliżej różnym rozwiązaniom( będę bazował na rozwiązaniach .netowych i php oraz troszkę na rubym, pozostałych nie znam, ale zapraszam do podzielenia się) w kontekście potrzeb opisanych w poprzednim paragrafie nasuwa się parę wniosków:
- Sharepoint – wielkie rozwiązanie, praktycznie serwer aplikacji, ma bardzo duże możliwości, ale wymaga sporej wiedzy na temat windows i funkcjonowania samego sharepointa. Z tego co kojarzę koszt licencji dla sharepointa wystawionego w Internecie też jest dosyć znaczny.
- Drupal, phpNuke, joomla, mambo – również spore możliwości, niestety także trzeba poznać same rozwiązania i ich specyfikę
- W ruby on rails rozwiązano ten problem trochę inaczej. Powstał mały CMS – Comatose, który można dowolnie podłączyć do swojej aplikacji na zasadzie biblioteki, skonfigurować i już mamy prosty CMS.
Oczywiście istnieją zagrożenia przy używaniu gotowych środowisk( w głównej mierze dotyczy to pierwszych 2 rozwiązań). Po pierwsze same systemy narzucają pewne ograniczenia wynikające z założeń projektowych. Twórcy mogą napisać własne moduły ale w pewnych ramach np. trudno będzie dodać kontrolę dostępu na poziomie wiersza. Dodatkowym problemem może być zautomatyzowane testowanie, wiele z serwerów aplikacji/CMS nie przewidziało możliwości testowania własnych modułów i wtyczek, więc może np brakować interfejsów do mockowania itd – to naprawdę może zabić projekt.
Dla mnie najbardziej eleganckie wydaje się metoda proponowana przez Comatose w Ruby on Rails. Pozwala twórcy utrzymać maksymalną kontrolę nad aplikacją jako całością z zachowaniem elastyczności systemu CMS. Zainspirowany tą metodą szukałem czegoś podobnego co można by dołączyć do .net. Okazuje się, że na razie nic takiego nie istnieje. Noszę się z zamiarem stworzenia takiego projektu(Comatose.NET???), na razie jest to w fazie pomysłu, ale wydaje mi się, że asp .net mvc(a szczególnie system.web.routing) się do tego nadaje. Jesteś zainteresowany tym tematem? Masz jakieś przemyślenia? Podziel się nimi…
