Entwickler-Ecke

WPF / Silverlight - Dynamisches Control suchen


Raorkon - Di 19.07.11 22:14
Titel: Dynamisches Control suchen
Hallo zusammen,

ich habe in einen Stackpanel über den Code ein Image hinzugefügt. Soweit funktioniert das auch, allerdings möchte ich in einer weiteren Methode dieses Image bearbeiten. Leider finde ich das Control dann nicht, komischerweise wenn ich das Stackpanel-Control mir im Debugger anschaue dann finde ich das Image und kann auch den Name sehen, was mach ich falsch?


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<Window x:Class="FS_Test2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="301" Width="292" Loaded="Window_Loaded" Initialized="Window_Initialized" WindowState="Maximized"
        Drop="photoPanel_Drop" AllowDrop="True">
    <DockPanel AllowDrop="True">
        <StackPanel Name="main" DockPanel.Dock="Top" Drop="photoPanel_Drop" 
                    AllowDrop="True" 
                    ClipToBounds="True" Visibility="Visible" DragEnter="main_DragEnter">
            <Menu>
                <MenuItem Header="{DynamicResource File}"/>
                <MenuItem Header="{DynamicResource Help}"/>
            </Menu>

        </StackPanel>
    </DockPanel>
</Window>




C#-Quelltext
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:
32:
33:
        private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {

            double value = e.NewValue;

            Image test = main.FindName("image"as Image;
            //hier erhalte ich immer eine null
            ...
            
        }

        private void photoPanel_Drop(object sender, DragEventArgs e)
        {
                    ...
                    
                    Image img = new Image();

                    img.Source = bitmap;
                    img.Name = "image";
                    img.Width = bitmap.Width;

                    img.Height = bitmap.Height;

                    Point p = e.GetPosition(photopanel);

                    img.Margin = new Thickness(0000);
                    img.VerticalAlignment = VerticalAlignment.Center;
                    img.AllowDrop = true;


                    main.Children.Add(img);
 
        }


Kha - Mi 20.07.11 11:54

Du speicherst die Instanz einfach in einem Klassenfeld :gruebel: ?


Raorkon - Mi 20.07.11 18:45

hmm finde ich irgendwie unschön :P


Raorkon - Mi 20.07.11 19:03

so hab die Lösung, wenn man dynamisch Controls hinzufügt muss mann diese auch registrieren


C#-Quelltext
1:
2:
                    NameScope.SetNameScope(thisnew NameScope());
                    RegisterName(img.Name, img);



und schon kann man den kram auch finden, dank dir trotzdem


Kha - Do 21.07.11 12:29

user profile iconRaorkon hat folgendes geschrieben Zum zitierten Posting springen:
hmm finde ich irgendwie unschön :P
Mit der Meinung dürftest du allein auf weiter Flur stehen. Der Begriff "Magic Constant" ist dir bekannt?


Raorkon - Do 21.07.11 12:36

kannte ich bisher noch nicht den Begriff aber finde ich immer noch unschön in diesem zusammenhang.

Denn wenn ich mehrere Pics einfügen will/lasse stehe ich dabei schon vor einen Problem


Kha - Do 21.07.11 14:31

Und die Lösung lautet List<Image>.

Bzw. ist es in WPF grundsätzlich unschön bzw. unnötig, jemals im Code-Behind Controls zu erstellen. Data Binding mit Templates ist so elegant, dass man nie mehr zurück möchte :) .


Raorkon - Do 21.07.11 15:43

aber ich seh keine Möglichkeiten dynamisch unterschiedliche Bilder oder ähnliches einzufügen und dazu entsprechende unterschiedliche Kontexmenüns hinzuzufügen. Und die Möglichkeit des Code-Behind wurde mir in einen Fachbuch empfohlen. Daher habe ich diese Möglichkeit genutzt. Mit Templates habe ich mich noch nicht wirklich auseinander gesetzt (steht zwar im Buch, aber hatte noch keine Zeit das Kapitel zu lesen)


Kha - Do 21.07.11 17:18

user profile iconRaorkon hat folgendes geschrieben Zum zitierten Posting springen:
aber ich seh keine Möglichkeiten dynamisch unterschiedliche Bilder oder ähnliches einzufügen und dazu entsprechende unterschiedliche Kontexmenüns hinzuzufügen.
War das auf die Klassenfelder oder Data Binding bezogen? Es funktioniert jedenfalls beides, aber ja, für den Anfang ist es nicht schlimm, im Code-Behind - quasi nach Winforms-Art - zu programmieren, die WPF-Lernkurve ist schon steil genug.


Raorkon - Sa 23.07.11 22:24

bezogen auf das Databinding