Autor Beitrag
kannix
Hält's aus hier
Beiträge: 6

Vista, Ubuntu
C# (VS 2008)
BeitragVerfasst: Mo 19.01.09 15:23 
Also ich würde gerne eine ObservableCollection als Binärbaum darstellen.
Dabei ist das oberste Element das erste Objekt in der Collection, das zweite das linke Kind von ObservableCollection[0], das dritte das rechte Kind usw.
Da diese Anordnung ja nicht sonderlich kompliziert ist kann es doch eigentlich nicht so schwer sein, oder?
Bis jetzt habe ich nur die Kreise, die die Elemente anzeigen erstellt und zum testen in ein StackPanel gepackt. Das ganze sieht dann so aus:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<ItemsControl x:Name="BinaryTree" Grid.Column="1" HorizontalAlignment="Center">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Height="40" Width="40">                           
                            <Ellipse Fill="Silver"/>                           
                            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding}"/>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Das Endergenis stelle ich mir in etwa so vor wie bei dieser Darstellung (die verbindenden Linien müssen erstmal nicht sein, da ich denke dass es um einiges leichter ist wenn ich die weg lasse ;-) ):
upload.wikimedia.org...de/2/2a/Heapsort.png
Kann ich die ganze Anordnung irgendwie in dem Template des ItemsControl festlegen oder was ist da am einfachsten/elegantesten?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 19.01.09 18:12 
Die Transformation in einen Binärbaum musst du auf jeden Fall im Code-Behind machen, das schafft Xaml nicht. Wenn du dann zwei Klassen Node und Leaf hast, kannst du für beide ein DataTemplate erstellen (in den Ressourcen, ohne Key), dann wird automatisch immer das richtige ausgewählt. In diesen kannst du dann Properties wiederum rekursiv über ContentControls binden - kurzum, da ich bis gerade selbst nicht wusste, wie genial WPF ist :eyecrazy: , hier ein kleines Beispiel:
ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="Window1"
        Height="300"
        Width="300">
    <Window.Resources>
        <DataTemplate DataType="{x:Type sys:String}">
            <Button>
                <StackPanel>
                    <TextBlock Text="{Binding}" />
                    <ContentControl Content="{Binding Length}" />
                </StackPanel>
            </Button>
        </DataTemplate>
        <DataTemplate DataType="{x:Type sys:Int32}">
            <Rectangle Fill="Red"
                       Height="10"
                       Width="{Binding}" />
        </DataTemplate>
    </Window.Resources>
    <ItemsControl>
        <ItemsControl.ItemsSource>
            <x:Array Type="sys:Object">
                Hallo
                <sys:Int32>10</sys:Int32>
            </x:Array>
        </ItemsControl.ItemsSource>
    </ItemsControl>
</Window>

_________________
>λ=