2009-12-04 12 views
5

W celu stworzenia wygodnego interfejsu dla aplikacji WinForm .Net 2.0, nad którą pracuję, potrzebuję kontroli, którą jestem pewna, wykracza poza "standardowe działanie" dowolnego standardowego kontrolera. Mock-up, co staram się osiągnąć w następujący sposób:Kompleks .Net 2.0 Formanty Windows Forms: od czego zacząć?

Mock up http://www.claware.com/images/temp/mockup.png

Zasadniczo ta część prób aplikacyjnych do analizowania słów na sylaby z języków plemiennych (nie odnosi się do słownika; wszelkie Unicode Możliwe są znaki.) Do czasu, gdy użytkownik zajdzie tak daleko, już zdefiniował samogłoski/spółgłoski w swoim języku i inną konfigurację. Następnie następuje iteracyjny proces (1) aplikacji zgaduje, jakie sylaby istnieją w języku opartym na niektórych regułach, (2) użytkownik ulepsza domysły, wybiera odpowiednie parsowania lub ręcznie parsuje słowo, (3) aplikacja "uczy się "od opinii użytkownika i sprytnie domysły, (4) powtarzaj, aż dane będą" wystarczająco dobre ", aby przejść dalej.

Kontrola musi przedstawiać każde słowo (szare nagłówki), a następnie wszystkie domysły łamania sylaby (białe obszary z kropkami oddzielającymi części słów). Istnieje również sposób ręcznego wprowadzenia analizy składniowej, która będzie wyświetlana obszar tekstowy i przycisk zapisu (u dołu makiety). Gdy użytkownik unosi się nad odgadywaniem, zmienia się tło i pojawiają się przyciski "zaakceptuj/odrzuć". Kliknięcie na akceptację lub przejście do ręcznego parsowania usuwa całe słowo z listy. Kliknięcie przycisku odrzucania usuwa tylko ten element.

Nie jestem w 100% sprzedany na formatowanie, które mam powyżej, ale myślę, że można uzyskać ogólne pojęcie o rodzajach formatowania i kontroli funkcjonalnej, których potrzebuję. Kontrolka będzie również przewijać się w pionie - początkowo mogą to być tysiące słów.

Moje pytanie dla doświadczonych programistów WinForms: od czego zacząć? Naprawdę bardzo chciałbym pozostać w ramach jądra .Net i rozszerzyć istniejącą kontrolę, a nie kontrolę zewnętrzną. (Ryzykując rozpoczęcie wojny religijnej: tak, cierpię na zespół NIH, ale jest to świadoma decyzja oparta na wielu rozwiązaniach szybko rozwiązujących, ale długotrwałych problemach z kontrolkami stron trzecich.) Gdzie mogę uzyskać najwięcej "huk dla mojego bucka" i co najmniej ponowne wymyślenie koła? ListView? Skrzynka na listy? ScrollableControl? Czy muszę przejść całą drogę z powrotem do Control i malować wszystko ręcznie? Doceniam każdą pomoc, która może być dostarczona!

[Edytuj] Dziękuję wszystkim za pomysły. Wydaje się, że najbardziej eleganckim rozwiązaniem dla moich celów jest stworzenie niestandardowego sterowania składającego się z FlowLayoutPanel i VScrollBar. FlowLayoutPanel może zawierać wystąpienia niestandardowych formantów używanych dla każdego słowa. Ale FlowLayoutPanel jest wirtualny, tzn. Zawiera tylko te wystąpienia, które są widoczne (i niektóre "tylko poza zwojem"). Zdarzenia VScrollBar określają, co należy załadować. Trochę kodu do napisania, ale nie jest tak źle i wydaje się działać dobrze.

+0

Czy korzystanie z WPF jest utrudnione? Pod jednym względem jest to WinForms + HTML, a Twoje makiety można łatwo wykorzystać w Expression Blend. – sipwiz

+0

Niestety, tak. Często mam "mężczyznę, naprawdę chciałabym móc skorzystać z WPF". –

+0

Byłbym zainteresowany, aby zobaczyć gotowy artykuł .... – cjk

Odpowiedz

4

Spojrzałbym na formanty TableLayoutPanel i FlowLayoutPanel. Pozwoli Ci to zorganizować serię kontrolek z umiarkowaną łatwością w pionie. Następnie utworzyłbym UserControl składający się z etykiety i 2 przycisków. UserControl eksponuje właściwości, takie jak tekst i zdarzenia, które są narażone na kliknięcia przycisku. Dla każdego wpisu na liście utworzymy instancję UserControl, przypiszemy wartość tekstową i obsłużyliśmy zdarzenia kliknięcia. Instancja zostanie umieszczona w panelu Tabela/Flow w prawidłowej kolejności. Oba te panele układu pozwalają na wstawianie elementów między innymi elementami, dzięki czemu możesz dynamicznie dodawać i usuwać elementy z listy.

Edycja: Biorąc pod uwagę długość tego, co próbujesz renderować, rozważałbym użycie DataGridView i wykonanie niestandardowego renderowania, aby mógł on wykonać to, w jaki sposób ma działać. Wykorzystując zdarzenia renderowania DGV możesz łączyć kolumny, zmieniać kolory tła (np. Podświetlając ciemnoszare linie), włączać/wyłączać przyciski i obsługiwać zmianę siatki w tryb edycji dla swoich wierszy, aby umożliwić modyfikację lub wstawianie nowych wartości . Ta metoda z łatwością poradziłaby sobie z dużymi zestawami danych i można było z łatwością powiązać je bezpośrednio z nimi.

+0

Dla mniejszego zestawu danych może to działać całkiem dobrze. Ale zabrakło mi klamek okiennych na długo przed tym, jak zbliżyłem się do ładowania FlowLayoutPanels.Tysiące słów razy kilka kontroli użytkownika na słowo = za dużo. Może "wirtualna" wersja tego, śledzenie pozycji przewijania ... –

+0

Tęskniłem za "tysiącami słów" częścią pierwotnego pytania. Zaktualizuję swoją odpowiedź za pomocą innego możliwego rozwiązania. –

+0

Uruchomiona zostanie wirtualna wersja zagnieżdżonych niestandardowych formantów z FlowLayoutPanel. –

0

Oto, jak to zrobić:

Utwórz niestandardowy formant. W tym niestandardowym kontrole, mają ListBox na LinkButton, a po kliknięciu LinkButton można go ustąpić TextBox. ListBoxy będą miały górny rząd niemożliwy do zaznaczenia ... prawdopodobnie możesz uzyskać resztę z tego miejsca. Po otrzymaniu listy słów, wypełnić przewijalnych jakiegoś jedną kontrolę dla każdego słowa:

(foreach String word in words){ 
    myScrollable.add(new MyComponent(word)); 
} 

Stamtąd, nie jestem pewien, co chcesz zrobić ze skrzynek lub dane, ale to mój pierwszy pomysł dotyczący konfiguracji interfejsu użytkownika.

2

Cóż, z pewnością wygląda to na kandydata do niestandardowego komponentu, który powinieneś sam tworzyć. Możesz stworzyć to za pomocą standardu.Polecenia do rysowania netto wraz z polem tekstowym i regularnym sterowaniem przyciskami.

Teraz chcesz się dowiedzieć, od czego zacząć.

Utwórz projekt biblioteki Windows Forms Control Library. Upuść pole tekstowe i przycisk sterowania.

Kod rysunkowy panelu powinien być najlepiej kodowany. Można to zrobić za pomocą zwykłych poleceń GDI +.

Edit:

Oto kolejny pomysł, a jeden, że mam praktycznie wykorzystywane w moim projekcie z wielkim sukcesem.

Możesz użyć kontrolki przeglądarki internetowej w aplikacji i pokazać swoje dane jako html. Możesz zaktualizować źródło sterowania przeglądarką internetową na podstawie danych wejściowych w polu tekstowym, a kliknięcie linków w formancie przeglądarki internetowej da ci zdarzenie, które możesz wykorzystać do wykonania jakiegoś działania. Twój CSS zadziała.

Użyłem tej techniki do zbudowania "pulpitu" w aplikacji, którą napisałem o nazwie "Prawidłowe oprogramowanie księgowe". Ludzie tak bardzo lubili pulpit, że jest to jedna z najbardziej ulubionych funkcji aplikacji.

+0

To brzmi bardzo interesująco. Jak sobie radziłeś z obrazami? Zapisz je w katalogu tymczasowym i wskaż tam znaczniki ? A może jest bardziej elegancki sposób? –

+0

Umieściłem je w określonym folderze w aplikacji. Myślę, że to jest idealnie eleganckie podejście do tego. –

+0

Chociaż ostatecznie nie przeszedłem na trasę przeglądarki internetowej, jest to fascynujący pomysł, o którym nigdy nie pomyślałam i doceniam ten pomysł. Może się to przydać w innym projekcie! –

0

Użyj formantu WebBrowser i wygeneruj znaczniki HTML za pomocą DocumentStream lub DocumentText.

Powiązane problemy