Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# alternatywa dla pictureboxa (canvas+user control WPF)

tekturka 12 Wrz 2011 18:03 2727 7
  • #1 12 Wrz 2011 18:03
    tekturka
    Poziom 10  

    Witam,

    pisze program, który posiada między innymi taką funkcjonalność. Na formę z pictureboxem dodaje wierzchołki które po spełnienu określonych warunków łączą się ze sobą(powstaje graf taki jak na rysunku)
    C# alternatywa dla pictureboxa (canvas+user control WPF)

    chciałbym żeby po kliknięciu na wierzchołek (czarny kwadrat) można go przesunąć, ale wydaje mi się że używając pictureboxa nie można tego zrobić, mógłby ktoś podpowiedzieć w czym i mniej więcej jak to najłatwiej zrobić

    z góry dziękuję za pomoc

    pozdrawiam tektura

    0 7
  • #2 12 Wrz 2011 19:08
    loganek2
    Poziom 16  

    hmm, a nie mógłbyś rysować bezpośrednio na formie czy panelu, a jako "kropki" ustawiać pojedyncze pictureboxy? w tedy nie miałbyś problemów z przechwyceniem zdarzeń kliknięcia w kropke, czy jej przesuwania

    0
  • Pomocny post
    #3 12 Wrz 2011 19:25
    markonedj
    Poziom 22  

    Możesz spokojnie rysować na PictureBoxie.

    Tutaj masz bardzo fajny kod na początek (nie mój, znaleziony w necie)

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Robi dokładnie to co chcesz, masz prostą z charakterystycznym kwadracikiem, który możesz przesuwać po całej kontrolce, a prosta reaguje na Twoje zmiany.

    0
  • #4 12 Wrz 2011 20:58
    wiesniak
    Poziom 31  

    Rozważałeś użycie WPF zamiast winforms? WPF jest zdecydowanie potężniejszy i przygotowany pod różne graficzne fajerwerki.
    Zobacz na http://graphsharp.codeplex.com/ - jakiś czas temu bawiłem się tym i w bardzo krótkim czasie udało mi się stworzyć pożądane grafy.

    0
  • #5 13 Wrz 2011 19:20
    tekturka
    Poziom 10  

    Dzięki wielkie za wszystkie odpowiedzi,

    markonedj dokładnie o takie coś o chodziło :D

    wiesniak
    próbowałem zrobić coś używając własnie graphsharp ale wydało mi się trudne w użyciu i sobie odpuściłem. Ale może warto spróbować jeszcze raz skoro piszesz że szybko można w tym coś zrobić. Dzięki

    0
  • #6 19 Sty 2012 13:34
    tekturka
    Poziom 10  

    witam podbijam,temat

    trochę zmieniła mi się koncepcja, stworzyłem projekt z wykorzystaniem WPF.

    C# alternatywa dla pictureboxa (canvas+user control WPF)

    Zielony obszar to konntrolka canvas, przez kliknięcie myszką dodaje do niej węzły(czerwone kropki) UserControl po spełnieniu warunku powstaje graf.

    mogę maksymalizować projekt i wtedy zwiększa mi się obszar do którego mogę dodawać węzły

    C# alternatywa dla pictureboxa (canvas+user control WPF)

    ale po przywróceniu okienka do poprzedniego rozmiaru powstaje coś takiego

    C# alternatywa dla pictureboxa (canvas+user control WPF)


    chciałbym żeby:
    1. węzły były wyświetlane tylko na zielonym obszarze(kontrolka canvas)
    2. przesuwać zawartości kontrolki myszką
    3. możliwość zwiększania i zmniejszania tego co wyświetlam w tej kontrolce.
    4. oraz brak możliwości dodania węzła w miejscu gdzie on już się znajduje, teraz dodaje mi się jeden na drugi

    Prosiłbym o jakieś sugestie.
    Pozdrawiam

    0
  • Pomocny post
    #7 19 Sty 2012 17:46
    wiesniak
    Poziom 31  

    Myślę, że mógłbyś ujarzmić Canvas za pomocą kontrolki ScrollViewer.
    Zobacz np: http://stackoverflow.com/questions/2828942/how-to-draw-scrollbars-on-wpf-canvas.
    Do zrobienia zoomu może się przydać kontrolka Slider, przykłady:
    http://stackoverflow.com/questions/850554/zoom-control-to-wpf-form
    http://social.msdn.microsoft.com/Forums/en/wpf/thread/b141a9d1-dfbc-4992-969a-3d3672c7e18f.

    Jeśli chodzi o punkt 4, to musiałbyś w jakiś sposób sprawdzać współrzędne pozostałych punktów albo napisać jakiegoś menadżera ułożenia, który zajmował by się pozycjonowaniem wszystkich punktów po dodaniu / usunięciu.

    Polecam też rzucić okiem do kodu biblioteki GraphSharp - tam właśnie jest taki slider od zoomu itd, więc miałbyś z czego "zgapiać" :-)

    0
  • #8 20 Sty 2012 11:33
    tekturka
    Poziom 10  

    dzięki, za pomysły

    z 1pkt sobie poradziłem wystarczy zaznaczyć we właściwościach kontrolki canvas "ClipToBounds". Z 4 też, przechwytuje zdarzenie myszki gdy jest nad węzłem, dodaje zmienną i blokuj możliwość dodanie nowego elementu gdy kursor jest nad węzłem. Zoom też rozwiązałem, tak jak tutaj http://stackoverflow.com/questions/2443004/wpf-zoom-canvas-and-maintain-scroll-position

    Została jedna rzecz.

    We właściwościach canvas mam ustawione Weight i Height na auto i max rozmiar na nieskończony. Chciałbym żeby tak zostało i żebym mógł przesuwać myszką zawartość kontrolki, dalej nie wiem jak to zrobić :(

    0