Dodanie metody do kontrolki

0

Witam,
jak najprościej do kontroli dodać metodę ? Mianowicie chodzi mi o dodanie kliku metod do System.Windows.Controls.TreeView. Myślałem o stworzeniu nowej kontrolki która dziedziczy po TreeView, ale za bardzo mi to nie idzie. Jakieś ciekawe pomysły ? :)
Pozdrawiam.

0

Prościej niż dziedzicząc po TreeView i dodając metody tego nie zrobisz.

0

Ok, tworząc "rozszerzoną" kontrolkę wystarczy że stworzę nową klasę czy musi to być User Control ? Zrobiłem to także stworzyłem klasę która dziedziczy po TreeViewItem. W pliku MainWindow.xaml dodałem

xmlns:AP="clr-namespace:App"

oraz

<AP:TreeItem Name="test" />

Skończyło się tym że zmienna "test" jest niewidoczna w oknie. Może o czymś zapomniałem ?

1

Zależy co ta metoda ma robić. Możesz użyć Extension method do rozszerzenia funkcjonalności kontrolki bez tworzenia nowej klasy, ale z tego co się orientuję nie będziesz miał wtedy dostępu do pól prywatnych kontrolki, chyba, że przez jakąś refleksję.

Przykład:


public static void TwojaNowaMetoda(this TreeView control)
{
     //operacje na publicznych właściwościach kontrolku TreeView
}
 

A wywołasz to wtedy tak:

TreeView control = new TreeView();
control.TwojaNowaMetoda();
 

Pozdrawiam
Łukasz Gawron

0

Doszedłem do wniosku, że muszę dodać również pola. Więc najlepsza będzie opcja z dziedziczeniem, macie może jakieś materiały jak zrobić nową kontrolkę dziedzicząc po innej ? W googlach znalazłem tylko jak napisać od nowa.

0

Ciekawi mnie kto i dlaczego mnie zminusował? Czy udzieliłem na coś złej odpowiedzi? Podałem jedną z możliwości rozwiązania problemu przedstawionego przez autora wątku.
Interesująco ktoś ocenia wartość posta :(

0
gawronlukasz napisał(a)

Ciekawi mnie kto i dlaczego mnie zminusował? Czy udzieliłem na coś złej odpowiedzi? Podałem jedną z możliwości rozwiązania problemu przedstawionego przez autora wątku.
Interesująco ktoś ocenia wartość posta :(

Podałeś jedną z możliwości, ale po pierwsze po co mieszać z extension metodami autorowi, który ma problem z dziedziczeniem, po drugie po co próbować zastąpić nimi dziedziczenie?

Pierwsze widzę WPF na oczy, ale takie coś działa:

<TreeView x:Class="WpfApplication1.MajTriWiu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1" >
</TreeView>
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class MajTriWiu : TreeView
    {
        public MajTriWiu()
        {
            InitializeComponent();

            this.Background = Brushes.Red;
            this.Items.Add("A");
            this.Items.Add("B");
            this.Items.Add("C");
            this.Items.Add("D");
        }
    }
}
0
somekind napisał(a)

Podałeś jedną z możliwości, ale po pierwsze po co mieszać z extension metodami autorowi, który ma problem z dziedziczeniem, po drugie po co próbować zastąpić nimi dziedziczenie?

Skoro z dziedziczeniem ma problemy to podaje po prostu inną możliwość, która nie wydaje mi się nazbyt skomplikowana, a również rozwiązuje jego problem. Po drugie kto mówi, żeby zastępować nimi dziedziczenie? Zarówno dziedziczenie jak i Extension method służą do rozwiązań pewnych problemów i w zależności od problemu raz może być lepsze dziedziczenie, a raz mogą być lepsze Extension method. Autor nie podał konkretnie jakie metody chce zaimplementować więc tak na prawdę nie wiadomo, który sposób będzie lepszy.

0
gawronlukasz napisał(a)

Skoro z dziedziczeniem ma problemy to podaje po prostu inną możliwość

Lepiej jednak ogarnąć dziedziczenie, które jest jedną z podstaw programowania obiektowego i występuje powszechnie w językach programowania.

Zarówno dziedziczenie jak i Extension method służą do rozwiązań pewnych problemów i w zależności od problemu raz może być lepsze dziedziczenie, a raz mogą być lepsze Extension method. Autor nie podał konkretnie jakie metody chce zaimplementować więc tak na prawdę nie wiadomo, który sposób będzie lepszy.

Extension methods są fajne, ale trzeba mieć jakieś doświadczenie w OOP, żeby wiedzieć, kiedy są dobrym rozwiązaniem, a kiedy tylko zamieszają. Metody te zawsze są obejściem jakiegoś problemu. Jest sens ich użyć do rozszerzania klas, których kodem źródłowym nie dysponujemy, bądź np. są częścią biblioteki, której nie chcemy rozbudowywać, a dodatkowa funkcjonalność będzie nam potrzebna tylko w jednym projekcie. Extension methods używamy TYLKO w wyjątkowych sytuacjach, a i wówczas z duszą na ramieniu.
Jeżeli potrzebuję nowej klasy, która rozszerza działanie starej klasy, to używam dziedziczenia. I tak trzeba zrobić w tym wypadku.

Co za cipa zminusowała post, w którym jest kod będący rozwiązaniem problemu autora wątku? :D

0

Trafiłem z forumowego piekła do nieba, było -1 jest 1 :) Ale ten mój post jest kontrowersyjny, nigdy bym nie pomyślał, że Extension method wzbudzą takie emocje :P Najważniejsze, że auto znalazł rozwiązanie swojego problemu :)
Pozdrawiam

0

Twoje rozwiązanie jest takie samo jak moje, więc nie działa...
Po dodaniu:

n<AP:Tree Name="TreeList" Grid.Column="0" BorderThickness="0" SelectedItemChanged="TreeList_SelectedItemChanged"/>

Jest błąd:

nie zawiera definicji "TreeList", a nie odnaleziono metody rozszerzającej "TreeList", która przyjmuje pierwszy argument typu "MainWindow" (czy nie brakuje dyrektywy using lub odwołania do zestawu?).
0

Nie wiem czy piszesz do mnie czy do kogoś innego, w każdym razie nie przypominam sobie, bym kiedykolwiek na którymkolwiek forum internetowym umieścił niedziałający kod.

Załączanie tradycyjnie nie działa, oto link: www.somekind.pl/_upload/tmp/WpfApplication1.zip

0

Źle mnie zrozumiałeś, chodzi mi o to że moje rozwiązanie jest takie identyczne. W tym co mi przysłałeś znalazłem mały szczegół różniący nasze klasy, dzięki za pomoc :)

0

A możesz zdradzić co to było w takim razie?
Bo wiesz, mi kod działał, Tobie początkowo nie działał, ale znalazłeś jakiś detal, który pewno jest ważny. Informacja o tym przyda się komuś na przyszłość.

0

Oczywiście że mogę :)
Zamiast:

<Tree Name="myTree" />

Wystarczyło zapodać:

<Tree x:Name="myTree" />

Po takim zabiegu obiekt stał się "widoczny" w oknie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1