Temat: Co ze stylami kontrolek generycznych?
Wrażliwy młody człowieku ;) Nie bierz do siebie moich uwag. Napisałem to, bo mam wrażenie, że masz mocny Formsowy background i próbujesz go przenieść do WPF. WPF to zupełnie inna bajka. Nie wykluczam, że kompletnie nie rozumiem problemu, który usiłujesz rozwiązać, ale mam wrażenie, że wyważasz otware drzwi.
W Forms wszystko jest Canvas'em + kotwice. WPF wspiera layout managery, które są wyjęte żywcem z Javy, a nie Formsów.
Zauważyłem,że developerzy mający doświadczenie w kodowaniu w Formsach wpadają w panikę zaczynając przygodę z WPF: gdzie mogę ustawić rozmiar mojej kontrolki?! Jak ustawić im pozycję?
Oczywiście. Canvasy mają swoje zastosowania. Ale pisząc normalne aplikacje użytkowe się ich nie wykorzystuje. Jeśli chciałbyś zrobić formularz do rozliczania podatku i używasz Canvasów do pozycjonowania texblockow i texboxów to mówię: nie tędy droga!!!
BTW: uważałbym z tym doublem do określania pozycji. Co prawda WPF używa doubli do określania pozycji, ale wątek renderujący już leci w single, co powoduje, że Twój "nowy układ współrzędnych" ma poważne ograniczenia i rozjeżdża się przy dużych wartościach współrzędnych gdy chcesz miec jednocześnie dużą precyzję. Tzn. gdy np na Canvasie chcialbys miec całą Polskę, ale chciałbyś się przybliżyć i dojrzeć Pałac Kultury.
To co proponujesz załatwia się tzw. lookless controls. Kontrolka nie definiuje wyglądu całkowicie, jej wygląd jest w domyślnym stylu (kontrolka tylko definiuje DefaultStyleKey, np. w Themes(albo gdzieś w rodzicu) definiuje się domyślny dla niej wygląd - styl). Pozwala to dziedziczyć klaski okien, co pozwala zmieniac zachowanie (a także w klasie pochodnej zmieniając wygląd jeśli trzeba - np. poprzez wspomniany DefaultStyleKey), jednocześnie pozwalając dowolnie definiować zawartość (poprzez ContentPresenter). Można w ten sposób zmienić wygląd wszystkich okien. Nie dotykając kodu.
Nie wyobrażam sobie edytowania wyglądu (widok zawiera nie tylko wygląd, ale też bindowania) poprzez zmianę stringa.
Ad1. Praca z designerem nie polega na tym, że on przygotuje Ci coś i wyjeżdża do ciepłych krajów. Klient zobaczy co zrobiłeś i powie, że chce zmian. Wtedy jesteś ugotowany bo musisz stringa wyciągnąć z powrotem żeby designer mógł pracować.
Ad2. To można załatwić tak, że wkładasz w content obiekt nie dziedziczący z Control/UiElement/FrameworkElement tylko dowolny obiekt modelWidok + DataTemplate gdzie masz widok.
Ad3. a) DataTemplate, b) Style, c) zaprojektowanie GUI w taki sposób, aby pozwolić podmienić elementy, które się mogą zmienić. W jednym miejscu, bez zmiany kodu.
Polecam książkę :
WPF Control Development Unleashed - fajnie koleś pokazuje jak zrobić z listview - widok sonaru łodzi podwodnej - zdaje się że przy użyciu akurat Canvas'a, ale nie o to chodzi.
MVVM:
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Tak na marginesie MVVM to słowo wytrych i dotyczy tylko warstwy prezentacji. Nie mówi nic o modelu. Ale tam obowiązują już "stare" wzorce.
Jacek Tomaka edytował(a) ten post dnia 01.02.11 o godzinie 00:27