Vymazání objektu z canvasu   otázka

C#, VB.NET, WPF, Silverlight

Zdravím, mám menší trabl v silverlight aplikaci.

Udělal jsem si třídu, ve které mám vytvořené seznamy ve kterých si držím jednotlivé grafické objekty.

Tzn. mám tam nadeklarované mimo jiné toto:

    Public _caraList As New System.Collections.Generic.List(Of System.Windows.Shapes.Line)
    Public _obdelnikList As New System.Collections.Generic.List(Of System.Windows.Shapes.Rectangle)
    Public _polygonList As New System.Collections.Generic.List(Of System.Windows.Shapes.Polygon)

Vždy když přidám do seznamu nový objekt, vrátím volající funkci referenci na objekt a přidám ho do canvasu na hlavním formuláři aby se vykreslil.

Pokud pak z hlavního formuláře zavolám toto:

       'toolbox je instance moji třídy
        toolbox._obdelnikList.Item(0).Width = 50
        toolbox._obdelnikList.Item(0).Height = 50

Daný objekt se na canvasu překreslí přesně tak jak chci

Pokud ale chci objekt vymazat a zadám toto:

   toolbox._obdelnikList.RemoveAt(0)

Nestane se vůbec nic. Item se ze seznamu opravdu vymaže, ale canvas na to nějak nereaguje. Příjde mi to divné, protože vzhledem k tomu že první případ funguje je zřejmé, že se skutečně předává reference. Musím na canvasu ještě zavolat nějakou metodu aby si uvědomil že se má překreslit, nebo je chyba v něčem jiném? Hledal jsem nějakou metodu refresh nebo repaint ale bohužel marně...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste změnit List na ObservableCollection, ta vyhazuje eventy, když do ní přidáte nebo odeberete prvek.

Jak tyhle kolekce propojujete s tím canvasem?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Objekty přidávám následovně. Ve své třídě mám například funkci addLine která vytvoří nový objekt, přidá ho do seznamu a vrátí volající metodě:

Kód ve tříde:

    Public Function AddLine(ByVal x As String, ByVal y As String, ByVal tloustkaCary As Integer) As Line

        Dim stetec As New SolidColorBrush
        stetec.Color = Me.ColorTwo


        'přidání položky do seznamu
        Dim cara As New System.Windows.Shapes.Line
        cara.X1 = x
        cara.Y1 = y
        cara.X2 = x
        cara.Y2 = y
        cara.Stroke = stetec
        cara.StrokeThickness = tloustkaCary


        _caraList.Add(cara)
        Return (_caraList.Item(_caraList.Count - 1))

    End Function

Vytvořený objekt vrátím do hlavního formulář proceduře, která funkci zavolala:

Private Sub mainCanvas_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles mainCanvas.MouseLeftButtonDown

   Me.mainCanvas.Children.Add(toolbox.AddLine(e.GetPosition(mainCanvas).X, e.GetPosition(mainCanvas).Y, Me.ComboSirkaCary.SelectedItem))
          
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem zjistil že daný objekt budu muset nejspíš z canvasu vymazat ručně.

Toto je ok:

        mainCanvas.Children.Remove(_obdelnikList.Item(0))
        _obdelnikList.RemoveAt(0)

Pokud tedy ObservableCollection vyhazuje eventy tak to půjde elegantně udělat s jeho pomocí (vyzkouším).

Pořád ale nějak nemůžu pochopit proč zůstane vykreslený objekt, na který se odkazuju referencí a který jsem už ze seznamu smazal.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Klasický List neruší reference, ale pouze si objekty vyjme ze své struktury. Pakliže je reference na objekt ještě někde jinde, tak tam zustane. Aspoň myslím. Proto je potřeba objekt vyjmout z obou kolekcí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback