Storyboard riesco a trovare elementi ControlTemplate

Ho creato alcuni abbastanza semplice XAML, e funziona perfettamente (almeno in KAXML). La storyboard funzionare perfettamente quando chiamato dall’interno il codice XAML, ma quando provo ad accedere dall’esterno ricevo l’errore:

'buttonGlow' name cannot be found in the name scope of 'System.Windows.Controls.Button'.

Io sono carico XAML con un flusso lettore, come questo:

Button x = (Button)XamlReader.Load(stream);

E cercando di eseguire Storyboard:

Storyboard pressedButtonStoryboard =   
    Storyboard)_xamlButton.Template.Resources["ButtonPressed"];
pressedButtonStoryboard.Begin(_xamlButton);

Penso che il problema è che i campi sono l’animazione del modello e storyboard è accedere al pulsante.

Qui è il codice XAML:

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:customControls="clr-namespace:pk_rodoment.SkinningEngine;assembly=pk_rodoment" 
    Width="150" Height="55">
    <Button.Resources>
        <Style TargetType="Button">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid Background="#00FFFFFF">
                            <Grid.BitmapEffect>
                                <BitmapEffectGroup>
                                    <OuterGlowBitmapEffect x:Name="buttonGlow" GlowColor="#A0FEDF00" GlowSize="0"/>
                                </BitmapEffectGroup>
                            </Grid.BitmapEffect>
                            <Border x:Name="background" Margin="1,1,1,1" CornerRadius="15">
                                <Border.Background>
                                    <SolidColorBrush Color="#FF0062B6"/>
                                </Border.Background>                                
                            </Border>                            
                            <ContentPresenter HorizontalAlignment="Center"
                                Margin="{TemplateBinding Control.Padding}"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding ContentControl.Content}"
                                ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"/>
                        </Grid>
                        <ControlTemplate.Resources>
                            <Storyboard x:Key="ButtonPressed">
                                <Storyboard.Children>
                                    <DoubleAnimation Duration="0:0:0.4"
                                                  FillBehavior="HoldEnd"
                                                  Storyboard.TargetName="buttonGlow"
                                                  Storyboard.TargetProperty="GlowSize" To="4"/>
                                    <ColorAnimation Duration="0:0:0.6"
                                                  FillBehavior="HoldEnd"
                                                  Storyboard.TargetName="background"
                                                  Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"
                                                  To="#FF844800"/>
                                </Storyboard.Children>
                            </Storyboard>
                            <Storyboard x:Key="ButtonReleased">
                                <Storyboard.Children>
                                    <DoubleAnimation Duration="0:0:0.2"
                                                  FillBehavior="HoldEnd"
                                                  Storyboard.TargetName="buttonGlow"
                                                  Storyboard.TargetProperty="GlowSize" To="0"/>
                                    <ColorAnimation Duration="0:0:0.2"
                                                  FillBehavior="Stop"
                                                  Storyboard.TargetName="background"
                                                  Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"
                                                  To="#FF0062B6"/>
                                </Storyboard.Children>
                            </Storyboard>
                        </ControlTemplate.Resources>
                        <ControlTemplate.Triggers>
                            <Trigger Property="ButtonBase.IsPressed" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource ButtonPressed}"/>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard Storyboard="{StaticResource ButtonReleased}"/>
                                </Trigger.ExitActions>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Resources>
    <DockPanel>
        <TextBlock x:Name="TextContent" FontSize="28" Foreground="White" >Test</TextBlock>        
    </DockPanel>
</Button>

Eventuali suggerimenti da parte di chiunque ne capisce di WPF e XAML molto meglio di me?

È qui l’errore stacktrace:

at System.Windows.Media.Animation.Storyboard.ResolveTargetName(String targetName, INameScope nameScope, DependencyObject element)
at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer)
at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer)
at System.Windows.Media.Animation.Storyboard.BeginCommon(DependencyObject containingObject, INameScope nameScope, HandoffBehavior handoffBehavior, Boolean isControllable, Int64 layer)
at System.Windows.Media.Animation.Storyboard.Begin(FrameworkElement containingObject)
at pk_rodoment.SkinningEngine.ButtonControlWPF._button_MouseDown(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at ControlTestbed.App.Main() in C:\svnprojects\rodomont\ControlsTestbed\obj\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
  • Come stai visualizzando il pulsante? Sei l’aggiunta di come il bambino di qualcosa… ovunque?
  • Sì, l’aggiunta di un griglie Bambini.
InformationsquelleAutor Kris Erickson | 2008-09-30



5 Replies
  1. 20

    Finalmente trovato. Quando si chiama Iniziano storyboard che fanno riferimento a elementi in ControlTemplate, si deve passare il controllo modello.

    Modifica:

    pressedButtonStoryboard.Begin(_xamlButton);

    A:

    pressedButtonStoryboard.Begin(_xamlButton, _xamlButton.Template);

    Risolto il tutto.

    • Oh. Che è molto più facile. Imparare qualcosa di nuovo ogni giorno.
    • Risolto il mio problema. Ma la chiamata di Stop() non Interrompere la mia animazione.
    • Risolto il mio problema. Grazie!
    • C’è un modo per fare questo in XAML?
  2. 5

    Ho fatto il lavoro con la ristrutturazione, il codice XAML in modo che il SolidColorBrush e OuterGlowBitmapEffect erano risorse del pulsante e quindi di riferimento condivisi da Storyboards e gli elementi sono applicati. Ho recuperato il Storyboard e chiamato Begin() su di essa proprio come hai fatto tu, ma qui è la modifica XAML per la Button:

    (Si prega di notare le chiavi "buttonGlow" e "borderBackground" e tutti StaticResource estensioni di markup di riferimento.)

    <Button
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="150"
        Height="55">
        <Button.Resources>
            <OuterGlowBitmapEffect
                x:Key="buttonGlow"
                GlowColor="#A0FEDF00"
                GlowSize="0" />
            <SolidColorBrush
                x:Key="borderBackground"
                Color="#FF0062B6" />
            <Style
                TargetType="Button">
                <Setter
                    Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate
                            TargetType="Button">
                            <Grid
                                Name="outerGrid"
                                Background="#00FFFFFF"
                                BitmapEffect="{StaticResource buttonGlow}">
                                <Border
                                    x:Name="background"
                                    Margin="1,1,1,1"
                                    CornerRadius="15"
                                    Background="{StaticResource borderBackground}">
                                </Border>
                                <ContentPresenter
                                    HorizontalAlignment="Center"
                                    Margin="{TemplateBinding Control.Padding}"
                                    VerticalAlignment="Center"
                                    Content="{TemplateBinding ContentControl.Content}"
                                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" />
                            </Grid>
                            <ControlTemplate.Resources>
                                <Storyboard
                                    x:Key="ButtonPressed">
                                    <Storyboard.Children>
                                        <DoubleAnimation
                                            Duration="0:0:0.4"
                                            FillBehavior="HoldEnd"
                                            Storyboard.Target="{StaticResource buttonGlow}"
                                            Storyboard.TargetProperty="GlowSize"
                                            To="4" />
                                        <ColorAnimation
                                            Duration="0:0:0.6"
                                            FillBehavior="HoldEnd"
                                            Storyboard.Target="{StaticResource borderBackground}"
                                            Storyboard.TargetProperty="Color"
                                            To="#FF844800" />
                                    </Storyboard.Children>
                                </Storyboard>
                                <Storyboard
                                    x:Key="ButtonReleased">
                                    <Storyboard.Children>
                                        <DoubleAnimation
                                            Duration="0:0:0.2"
                                            FillBehavior="HoldEnd"
                                            Storyboard.Target="{StaticResource buttonGlow}"
                                            Storyboard.TargetProperty="GlowSize"
                                            To="0" />
                                        <ColorAnimation
                                            Duration="0:0:0.2"
                                            FillBehavior="Stop"
                                            Storyboard.Target="{StaticResource borderBackground}"
                                            Storyboard.TargetProperty="Color"
                                            To="#FF0062B6" />
                                    </Storyboard.Children>
                                </Storyboard>
                            </ControlTemplate.Resources>
                            <ControlTemplate.Triggers>
                                <Trigger
                                    Property="ButtonBase.IsPressed"
                                    Value="True">
                                    <Trigger.EnterActions>
                                        <BeginStoryboard
                                            Storyboard="{StaticResource ButtonPressed}" />
                                    </Trigger.EnterActions>
                                    <Trigger.ExitActions>
                                        <BeginStoryboard
                                            Storyboard="{StaticResource ButtonReleased}" />
                                    </Trigger.ExitActions>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Resources>
        <DockPanel>
            <TextBlock
                x:Name="TextContent"
                FontSize="28"
                Foreground="White">Test</TextBlock>
        </DockPanel>
    </Button>
    • Ehi, che funziona troppo! Grazie…
    • Stavo cercando di capire come fare quello che ha fatto, ma aveva scompigliato in su in qualche modo. Che è quando mi sono imbattuto negli passando il modello di elemento.
    • Il problema è che se metto il bagliore e storyboard al di fuori, lo storyboard è attivato su TUTTI i pulsanti sulla pagina di ottenere il bagliore!
    • Shimmy, quanto ‘al di fuori’ non li metti? Il mio esempio di sopra è tutto all’interno della Resources di un singolo Button. Se si mette tutto come Resources del Window, mi sarei aspettato di vedere ciò che si descrive. Il Storyboard deve rimanere all’interno del ControlTemplate in modo che ogni Button ottiene il suo proprio e non tutti condividono 1 istanza.
    • È possibile fare questo con una risorsa di tipo double? (Ad esempio, l’animazione l’opacità di un elemento all’interno di un modello)
  3. 1

    Penso solo che aveva questo problema.

    Mi permetta di fare riferimento al mio blog sull’argomento: http://www.cplotts.com/2008/09/26/dr-wpf-namescopes/

    Fondamentalmente, il trucco è che avete bisogno di chiamare Iniziare con un argomento che è un oggetto nello stesso ambito del nome che gli storyboard di destinazione.

    In particolare, dal campione di cui sopra, vorrei provare a chiamare Iniziare e inviare un riferimento al _background elemento nel modello.

    Fatemi sapere se questo non risolve il tuo problema.

    Aggiornamento:

    Mi piace Erickson, è la soluzione migliore del mio … e ha funzionato anche per me. Non so come ho perso overload del metodo Begin!

    • Il problema è che tutto ciò che è stato animato è stato il modello di controllo. Ho dovuto passare entrambi (_xamlButton, _xamlButton.Modello) il metodo begin. Problema simile, non è esattamente la stessa.
    • Hai provato quello che ho suggerito a tutti? Scommetto che avrebbe lavorato per la roba che è stato animato per me … è anche il modello di controllo. Tuttavia, mi piace il tuo metodo molto meglio.
    • c’è un xamly modo per fare questo?
    • Hmmm … non che io sappia … il namescope sono impliciti in come costruire il vostro xaml. Commento di nuovo qui, se si trova un modo!
  4. 1

    Mi sono imbattuto in questo errore. La mia situazione è un po ‘ diverso, forse più semplice. Ho una finestra WPF che ha un modello con un’animazione su di esso. Ho poi avuto un separato completamente estranei animazione innescato da MouseEnter definito per un pulsante, la finestra stessa. Ho iniziato a “button1 non può essere trovato in namescope’. Dopo aver giocato un po ‘ con alcune delle idee qui e il debug di effettivo Namescope (inserire un controllo sul risultato di NameScope.GetNameScope(questo), ho finalmente trovato la soluzione era mettere:

     this.RegisterName("button1", this.button1);

    in un MouseEnter metodo definito nel codice e associato al pulsante. Questo MouseEnter sarà chiamato prima di xaml Trigger. Curiosamente, il metodo di registrazione non funziona se è il costruttore o una Finestra.Attivato() metodo. Spero che questo aiuta qualcuno.

  5. 0

    (@ Sam Meldrum) Per ottenere SMETTERE di lavorare, aggiungere ‘vero per “isControllable” all’inizio

    pressedButtonStoryboard.Begin(_xamlButton, _xamlButton.Template);

    cambiare

    pressedButtonStoryboard.Begin(_xamlButton, _xamlButton.Template,true);

    e ora

    pressedButtonStoryboard.Stop(xamlButton)

    funzionerà

Lascia un commento