Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Gdy tworzę kontrolkę od podstaw to dziedziczę ją z Control aby pojawiła się w Toolboxie. Gdy w WPF dziedziczę z Window zamiast z Control to jest błąd mimo że Window dziedziczy z Control.
Mogę dziedziczyć nie bezpośrednio z Control - kontrolka Scrollbar w WPF dziedziczy z RangeBase, która jest abstrakcyjną klasą wspólną dla kilku kontrolek. I teraz problem, bo jeśli zrobię wspólną klasę nie abstrakcyjną to pokaże się w toolboxie, a gdy będzie abstrakcyjna, to designer dla kontrolki pokazuje błąd.

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Andrzej Borucki:
Gdy tworzę kontrolkę od podstaw to dziedziczę ją z Control aby pojawiła się w Toolboxie. Gdy w WPF dziedziczę z Window zamiast z Control to jest błąd mimo że Window dziedziczy z Control.
Mogę dziedziczyć nie bezpośrednio z Control - kontrolka Scrollbar w WPF dziedziczy z RangeBase, która jest abstrakcyjną klasą wspólną dla kilku kontrolek. I teraz problem, bo jeśli zrobię wspólną klasę nie abstrakcyjną to pokaże się w toolboxie, a gdy będzie abstrakcyjna, to designer dla kontrolki pokazuje błąd.

Wszystko się zgadza. WPF ma zmienione podejście do tworzenia nowych kontrolek i dziedziczenia. Sam też się na to naciąłem. Niestety trzeba się przestawić ze starego sposobu myślenia na nowy. Dość dobrze wyjaśnione co i jak.

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

A jak jest z abstrakcyjnymi klasami bazowymi w Windows Forms bo tam chciałem zrobić bazową klasę? Swoją drogą w WPF kontrolki mają wielkie możliwości dostosowania.

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Andrzej Borucki:
A jak jest z abstrakcyjnymi klasami bazowymi w Windows Forms bo tam chciałem zrobić bazową klasę? Swoją drogą w WPF kontrolki mają wielkie możliwości dostosowania.


Przyznaję się bez bicia - nie wiem.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Nie widzę racjonalnego powodu, by kontrolkę dziedziczyć po Window. Nie widzę racjonalnego powodu, by kontrolkę dziedziczyć po Control.

Lepsze jest UserControl, UIElement lub coś normalnego - i na tym budować własne kontrolki.

W ogóle dziedziczenie i WPF to dwie rzeczy, które się mocno gryzą. XAML po XAML-u nie dziedziczy - to po pierwsze. Należy się wyzbyć myślenia o dziedziczeniu w WPF dla swojego dobra i dobra projektu. To nie WinForms.

WinForms - dziedziczenie.
WPF - żadnego dziedziczenia.

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Borysław Bobulski:
Nie widzę racjonalnego powodu, by kontrolkę dziedziczyć po Window. Nie widzę racjonalnego powodu, by kontrolkę dziedziczyć po Control.

Lepsze jest UserControl, UIElement lub coś normalnego - i na tym budować własne kontrolki.

W ogóle dziedziczenie i WPF to dwie rzeczy, które się mocno gryzą. XAML po XAML-u nie dziedziczy - to po pierwsze. Należy się wyzbyć myślenia o dziedziczeniu w WPF dla swojego dobra i dobra projektu. To nie WinForms.

WinForms - dziedziczenie.
WPF - żadnego dziedziczenia.

Taki mały offtop w woli ścisłości. W WPF da się zastosować dziedziczenie ale tylko raz od klasy bazowej i to po zrobieniu pokracznego myku po którym wychodzi pokraczne coś pachnące tygodniowymi skarpetkami plebana. ;)

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Ale to właśnie w WPF ScrollBar dziedziczy po RangeBase, które jest bazową kontrolek ScrollBar, ProgressBar oraz Slider. Z tego co podpatrzyłem samo RangeBase dziedziczy z System.Windows.Controls.Control.
A jak jest z budowaniem kontrolki dziedziczącej po UIElement ? Brakuje Width i Height, które są w FrameworkElement.
Może warto dziedziczyć po UserControl, ale standardowe dziedziczą z Control. Jakie zalety ma UserControl w stosunku do Control?

konto usunięte

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

W jakim celu dziedziczysz? Czy chodzi o zachowanie kontrolki - chcesz rozszerzyć o nowe zdarzenia i/lub elementy - czy też chcesz jedynie zmienić prezentację? W tym drugim przypadku wystarczy zmienić Template.
Natomiast tworząc od zera kontrolkę i tak musisz dostarczyć jej defaultowy template.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Zgadzam się. Żeby zmienić wygląd kontrolki nie trzeba tworzyć na nowo kontrolki. WPF jest tak zaplanowane, że kontrolki są lookless - dzięki temu są gotowe, by z nimi cuda zrobić - dodawać animacje, dźwięki - cuda po prostu. Też nie wierzyłem, ale to prawda

Nie wierzę za to w inną rzecz - że ktoś jest w stanie wymyślić coś więcej - niż zmodyfikowany wyglądem ScrollBar.

Jeśli tak - to powinien jak najszybciej opatentować swój pomysł, bo być może miałby szansę zrewolucjonizować rynek zaskakująco odkrywczym interfejsem użytkownika.

Jeśli więc ktoś nie ma aspiracji, żeby podbijać rynek, powinien wziąć lookless control i nauczyć się dopasowywać jej wygląd i zachowanie (sic!) do swych potrzeb i fantazji. Doprawdy - nie ma takiej rzeczy, której nie da się zrobić z kontrolką WPF.

UserControl bardziej stosuje się jako pojemnik na inne kontrolki. Kiedyś pisałem kontrolkę do zaznaczania czasu na siatce. Oparłem to właśnie na UserControl, bo mi było wygodnie i prosto.
Ciekawostka - UserControl potrafi pomieścić wszystko to co Window - to może być przydatne, bo można zmienić okno w kontrolkę zmieniając tylko tag XAML i to co kiedyś było oknem, osadzić w innym oknie - już jako kontrolkę.

Jeśli chcesz coś zrobić na szybko - kalendarz z przyciskami, kontrolkę wyświetlające animacje 3D załadowaną dzięki informacji z property Filename itd. - użyj UserControl.
Chcesz mieć własny wygląd ScrollBar-a - zmień template.

Chcesz dodać dodatkowe eventy do ScrollBar-a (np. zdarzenie, które zachodzi gdy przesunąłeś ScrollBar o 100 jednostek)?

Możesz osadzić ScrollBar choćby w UserControl, podpiąć się z poziomu UserControl pod zdarzenie w stylu OnChange (z głowy wymyślam) i gdy kod w OnChange odkryje zmianę o 100 jednostek, wtedy UserControl zawoła kod podpięty pod zdarzenie On100UnitsChange

Tak dla przykładu. UserControl oczywiście zawiera dużo śmieciowatych properties, których nie użyjesz, więc być może warto to osadzić w jakiejś innej, "kontenerowatej" kontrolce.

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Borysław Bobulski:
Zgadzam się. Żeby zmienić wygląd kontrolki nie trzeba tworzyć na nowo kontrolki. WPF jest tak zaplanowane, że kontrolki są lookless - dzięki temu są gotowe, by z nimi cuda zrobić - dodawać animacje, dźwięki - cuda po prostu. Też nie wierzyłem, ale to prawda

Czy można w kontrolce drzewka mieć element nie napis ale TextBox czy Combo?

konto usunięte

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Czy można w kontrolce drzewka mieć element nie napis ale TextBox czy Combo?
Mówisz o TreeViewItem? Oczywiście, Header oraz Items przyjmują object(s) (a nie string) więc podstawiaj tam wszystko co uważasz, że ma sens (nawet obiekt video jeżeli uznasz, że tego użytkownik oczekuje:)

Ponadto kontrolka ta ma dwa punkty rozszerzenia: ItemTemplate oraz HeaderTemplate. I w ten sposób widać ogromną przewagę nad WinForm.

A oto przykład czegoś bez sensu, jakkolwiek technicznie poprawnego - zwróć uwagę, co idzie do Tooltipa:
<Button>
<Button>
<ToolTipService.ToolTip>
<StackPanel Orientation="Vertical">
<TextBox Text="Top secret" />
<Ellipse Fill="Pink" Width="50" Height="50" />
</StackPanel>
</ToolTipService.ToolTip>
<Rectangle Width="76" Height="50" Fill="Red" />
</Button>
</Button>

(WPF z WinPhone7.1 bo akurat taki projekt mam otworzony)Maciek Kański edytował(a) ten post dnia 08.01.12 o godzinie 15:06

Temat: Abstrakcyjna klasa bazowa własnej kontrolki

Borysław Bobulski:
Nie wierzę za to w inną rzecz - że ktoś jest w stanie wymyślić coś więcej - niż zmodyfikowany wyglądem ScrollBar.

Jak będziemy mieli własny scrollbar, to czy w jakiś sposób da się go podczepić do listy, drzewka czy textBoxa aby używać go zamiast standardowego?

Następna dyskusja:

Klasa bazowa dla singletona...




Wyślij zaproszenie do