[ Shadowed @ 29.07.2009. 10:42 ] @
Znam kako mogu napraviti custom panel. Pravim klasu nasledjenu iz Panel-a i override-ujem MeasureOverride i ArrangeOverride.
Medjutim, ono sto bi meni trebalo je da napravim klasu koja ce u isto vreme imati neki xaml i dodatno biti panel.
Recimo, da ima neke bordere i grafiku okolo i u srednjem delu da se nalaze child-ovi.

Medjutim, problem je sto ako kreiram user control i dobijem mogucnost da pravim xaml kod, ne mogu naslediti iz Panel-a u kodu. Buni se i kaze da ne nasledjuje iz istog tipa u razlicitim delovima parcijalne klase.

Postoji li neki nacin da se ovo prevazidje a da nije kreiranje tih dodatnih elemenata iz C# koda?
[ mmix @ 29.07.2009. 11:00 ] @
Zar ne mozes da enkapsuliras panel u user kontroli i da ga publikujes i da time bude dostupan iz forme?
[ Shadowed @ 29.07.2009. 11:28 ] @
Bio bi dostupan u kodu, kao public promenljiva, ali meni je potrebno da uradim sledece:
Code:

<My:CustomPanel>
    <Button Content="Test" />
</My:CustomPanel>


I da mi button bude u panel-u koji ima neku "dekoraciju" uradjenu u xaml-u.
Sta zapravo hocu... Da panel ima okvir i kvardratice za resize pa da korisnik moze menjati velicinu istog kao da je npr prozor.
[ mmix @ 29.07.2009. 12:21 ] @
Tesko preko user controle, sta vise nemoguce u tom formatu, eventualno uz malo gimanstike bi mogao da postignes nesto kao:

Code:

<My:CustomPanel>
    <My:CustomPanel.panel>
        <Button Content="Test" />
    </My:CustomPanel.panel>
</My:CustomPanel>


Ono sto ti hoces se zove agregacija i preduslov za agregaciju nasledjivanjem (bez interfejsa) je visetruko nasledjivanje, (ovde tebi treba da klasa tvoje user kontrole nasledjuje i Panel da bi se ponasala kao Panel i UserControl da bi je WFP konzumirao). Cela prica odmah pada u vodu jer CLI narafski ne podrzava vistruko nasledjivanje a WPF ne radi preko interfesja. Ta prica nije mogla ni u WInforms user controlama.

Eventualno mozes da pravis custom control koji nasledjuje samo od Panel, ali onda imas cimanje sa iscrtavanjem i pretpostavljam da ti se ne mili
[ Shadowed @ 29.07.2009. 13:00 ] @
Uspeo sam da ga nateram da nasledjuje Panel tako sto sam u obj/debug/MyControl.g.cs takodje stavio da je nasledjeno iz Panel-a i onda su sve parcijalne klase ok.
Medjutim, to ne resava problem jer onda nema onog sto je uradjeno u xaml-u a ni button se ne vidi.

Nema, veze, uradicu na neki drugi nacin...
[ Shadowed @ 02.10.2009. 15:19 ] @
Ovo se moze postici na sledeci nacin:
1. Desni klik na projekat, Add > New item...
2. Dodaje se nova CustomControl (ne UserControl). Visual Studio ce dodati fajlove CustomControl1.cs i Themes\Generic.xaml
3. Otvoriti CustomControl1.cs i u liniji public class CustomControl1 : Control zameniti Control sa CustomControl i sacuvati fajl.
4. Otvoriti Generic.xaml. Njegov default sadrzaj je:

Code:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1">


    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>


5. Izmeniti XAML kod da odgovara potrebama. Na primer (dajem samo deo gde je menjano):
Code:

                     <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <StackPanel>
                            <Label>Sadrzaj je ispod</Label>
                            <Border Background="Transparent" BorderBrush="DarkGray" BorderThickness="1" Padding="2">
                                <ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
                            </Border>
                        </StackPanel>
                    </Border>


Najbitniji deo je <ContentPresenter Content="{TemplateBinding ContentControl.Content}" />.
Na tom mestu ce biti ono sto se prilikom primene daje kao content.

6. Sada se moze primeniti kontrola kao npr. ovako:

Code:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <my:CustomControl1>
            <Button>test</Button>
        </my:CustomControl1>
    </Grid>
</Window>



Napomena: Ovo nije sasvim identicno onome sto sam pitao na pocetku, nije u pitanju panel, ali radi upravo ono sto mi je trebalo (i slicno je pitanom) pa sam ovde dao resenje.