none
Storyboard in CustomControl als DependencyProperty RRS feed

  • Frage

  • Schönen guten Morgen/Mittag :-)

    Folgende Frage: Wenn ich eine DependendyProperty mit dem Type Storyboard in einem CustomControl definiere:

            public static readonly DependencyProperty StoryProperty =
        DependencyProperty.RegisterAttached("Story", typeof(Storyboard),
        typeof(MyButton), new FrameworkPropertyMetadata(null, storychanged));
          
            public Storyboard Story
            {
                get { return (Storyboard)GetValue(StoryProperty); }
                set { SetValue(StoryProperty, value); }
            }
    
            internal Storyboard sbone = null;
            private static void storychanged(object sender, DependencyPropertyChangedEventArgs e)
            {
                MyButton myb = sender as MyButton;
                myb.sbone = (Storyboard)e.NewValue;
            }

    Und dann im XAML die "Story"-Property festlege mittels StaticResource:

    <custom:MyButton Content="Button" Story="{StaticResource myStoryBoard}"/>

    dann kann ich im Control auf das Storyboard zugreifen, das/die Child/s auslesen und bearbeiten. Ich kann quasi einer vorhandenen DoubleAnimation ein Target zufügen usw.

    Setzte ich das Storyboard im XAML allerdings direkt, also so:

    <custom:MyButton Content="Button">
                            <custom:MyButton.Story>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="Width" Duration="00:00:00.5" From="0" To="120" />
                                </Storyboard>
                            </custom:MyButton.Story>
                        </custom:MyButton>

    Dann bekomme ich im Code eine Exception, da die Eigenschaft DoubleAnimation schreibgeschützt ist.

    Wieso??

    MfG Flo


    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!

    Samstag, 22. März 2014 10:30

Antworten

  • Mir fehlt leider mkomentan etwas die Zeit um es ausführlicher zu ergründen warum es nicht geht. Momentan kann ich nur vermuten das beim verwenden einer statische Resource automatisch eine Kopie davon erstellt wird. Beim direkten übergeben dagegen man diese selbst anlegen muss:
    private static void storychanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        MyButton myb = sender as MyButton;
        myb.sbone = ((Storyboard)e.NewValue).Clone();
    }
    Von der Kopie kannst du dann alle Eigenschaften beliebig ändern. Die eingestellten Werte der StoryBoards werden dabei alle übernommen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Flo0806 Freitag, 28. März 2014 12:19
    Samstag, 22. März 2014 14:28
    Moderator

Alle Antworten

  • Hallo,
    ich kann dein Problem leider nicht reproduzieren. Ich habe zum testen einfach deinen oben gezeigten Code in ein neues Projekt eingefügt. Weder unter .NET 3.5 noch unter 4.5.1 gab es Probleme. Ich habe versucht die StoryBoard.TargetProperty-Eigenschaft un die Duration-Eighenschaft in storychanged zu ändern.

    Hast du noch anderen Code, der mit der DP in Zusammenhang steht? Eventuell wird das StoryBoard auch gerade ausgeführt, weswegen du es nicht ändern kannst.

    Kannst du uns vielleicht ein ausführbares Minimalbeispiel geben, in dem der Fehler auftaucht? So können wir dir besser helfen den Fehler zu beheben. Du kannst entweder den gesamten Coide hier posten oder das Projekt auf OneDrive hoch laden und den link hier teilen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 22. März 2014 11:38
    Moderator
  • Fehler gefunden.

    Mein Button ist in einem Datatemplate eines ItemsControl. Darum der Fehler. Setze ich den Button selbst, klappt es.

    Wie kann ich dieses Problem umgehen?


    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!



    • Bearbeitet Flo0806 Samstag, 22. März 2014 11:57
    Samstag, 22. März 2014 11:47
  • Genau, so sieht mein MainWindow aus:

    <Window x:Class="WpfApplication17.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:custom="clr-namespace:WpfApplication17"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <custom:MyButton Content="Button">
                <custom:MyButton.Story>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Width" Duration="00:00:00.5" From="0" To="120" />
                    </Storyboard>
                </custom:MyButton.Story>
            </custom:MyButton>
        </Grid>
    </Window>

    Das Control ist bei mir von UserControl abgeleitet. Aber auch wenn ich es von Button ableite gibt es kein Problem.

    Eigentlich sollte es auch keinen Unterschied machen, ob du eine Resource referenzierst oder es direkt angibst. So oder so wird eine Veränderliche Instanz übergeben.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 22. März 2014 11:52
    Moderator
  • Hab meine letzte Antwort gerade geändert. Vielleicht kannst du mir da auch helfen? :-)

    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!

    Samstag, 22. März 2014 11:57
  • Mir fehlt leider mkomentan etwas die Zeit um es ausführlicher zu ergründen warum es nicht geht. Momentan kann ich nur vermuten das beim verwenden einer statische Resource automatisch eine Kopie davon erstellt wird. Beim direkten übergeben dagegen man diese selbst anlegen muss:
    private static void storychanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        MyButton myb = sender as MyButton;
        myb.sbone = ((Storyboard)e.NewValue).Clone();
    }
    Von der Kopie kannst du dann alle Eigenschaften beliebig ändern. Die eingestellten Werte der StoryBoards werden dabei alle übernommen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Flo0806 Freitag, 28. März 2014 12:19
    Samstag, 22. März 2014 14:28
    Moderator