WPF Emergente de la gestión de eventos – Cómo activar cuando la ventana se abre

He creado una WPF Emergente que contiene una cuadrícula con frontera.
Hay algunos animación asociada con la frontera que quiero ser invocada cada vez que la ventana Emergente que se abre.

Actualmente, el código es como este

<Popup x:Name="myPopUp" >
  <Border x:Name="myBorder" >
    <Border.Triggers>
               <EventTrigger RoutedEvent="Popup.Loaded">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                    Storyboard.TargetName="myBorder" 
                                    Storyboard.TargetProperty="Height"
                                    From="10" To="255" Duration="0:0:0.20" />                      
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
     </Border.Triggers>
     <Grid />
   </Border>
</Popup>

Como por el código de la frontera se muestra la animación por primera vez la ventana emergente que se abre.
¿Qué cambios necesito hacer para activar la animación de borde cada vez que la ventana Emergente que se abre?

InformationsquelleAutor Souvik Basu | 2010-09-08

5 Kommentare

  1. 7

    Como por las sugerencias dadas aquí y un poco expireince ahora (he pedido este año de nuevo 🙂 ), yo podría averiguar la solución.

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
        <Style x:Key="popupStyle" TargetType="{x:Type Popup}" >
            <Style.Triggers>
                <Trigger Property="IsOpen" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                    Storyboard.TargetProperty="Height"
                                    From="10" To="255" Duration="0:0:0.20" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Width="100" Height="100" Click="Button_Click"></Button>
        <Popup Name="popUp" Width="100" Height="100"  Style="{StaticResource popupStyle}" >
            <Border x:Name="myBorder" Background="Blue"/>
        </Popup>
    </Grid>

    y un ejemplo de código para activar el menú emergente..

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            popUp.PlacementTarget = (Button)sender;
            popUp.IsOpen = true;
        }

    Aunque sólo puedo animar la ventana Emergente y no la Frontera aquí, casi da el mismo resultado.

  2. 1

    No estoy seguro de si la ventana emergente que se obtiene el foco cuando se abre, pero se puede usar el evento GotFocus si lo hace. Alternativamente, usted podría tratar de usar un datatrigger en el IsOpen es propiedad. Creo que tendrías que poner eso en un estilo, aunque en lugar de en línea.

    • No obtener el foco. Por favor eliminar esta de tu respuesta y voy a upvote.
  3. 0

    intentar cambiar tu evento desencadenante de la

    <EventTrigger RoutedEvent="Popup.Opened">

    • Emergente.Abierto no es un evento enrutado, es un evento normal.
    • Mi primera intuición fue para probar esto, pero como mdm20 menciona Abierto no es un evento enrutado de modo que puede utilizar en EventTrigger. Pero estoy en busca de una solución tan simple como este código.
    • ¿Por qué esta respuesta es incorrecta, tiene 3 upvotes?
  4. 0

    Usted puede lograr esto mediante la escucha de la IsOpen propiedad de dependencia como

        public MainWindow()
        {
            InitializeComponent();
    
            ////Listening to the IsOpen dependency property of the Popup.
            this.SetBinding(PopupIsOpenProperty, new Binding() { Source = this.popupContainer, Path = new PropertyPath("IsOpen") });
        }
    
        ///<summary>
        ///Gets or sets a value indicating whether [popup is open].
        ///</summary>
        ///<value><c>true</c> if [popup is open]; otherwise, <c>false</c>.</value>
        public bool PopupIsOpen
        {
            get { return (bool)GetValue(PopupIsOpenProperty); }
            set { SetValue(PopupIsOpenProperty, value); }
        }
    
        //Using a DependencyProperty as the backing store for PopupIsOpen.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PopupIsOpenProperty =
            DependencyProperty.Register("PopupIsOpen", typeof(bool), typeof(MainWindow), new PropertyMetadata(false, 
                (dependencyObject, e) =>
                {
                    var mainWindow = (MainWindow)dependencyObject;
    
                    if (mainWindow != null &&
                        (bool)e.NewValue == true)
                    {
                        ////Raise your event here... like
                        ////mainWindow.RaisePopupOpened();
                        System.Diagnostics.Debug.WriteLine("Popup Open Triggered");
                    }
                }));
    
        private void button_MouseLeave(object sender, MouseEventArgs e)
        {
            this.popupContainer.IsOpen = false;
        }
    
        private void button_MouseMove(object sender, MouseEventArgs e)
        {
            ////Setting the popup position
            var p = e.GetPosition(sender as UIElement);
            this.popupContainer.HorizontalOffset = p.X;
            this.popupContainer.VerticalOffset = p.Y;
    
            ////Enabling popup when it is hover on the button
            this.popupContainer.IsOpen = true;
        }
    
    
    <!-- XAML Starts here-->
    <Grid>
        <Button x:Name="button1" Content="This is a sample text" MouseMove="button_MouseMove" MouseLeave="button_MouseLeave" Width="100" Height="25" />
        <Popup x:Name="popupContainer" IsHitTestVisible="False" >
            <Grid Background="White">
                <TextBlock Text="{Binding Content, ElementName=button}" />
            </Grid>
        </Popup>
    </Grid>

    HTH

    • Esta solución funcionó para mí. Sin embargo, siento que este es el tipo de conseguir lo hace en una pequeña ronda de sobre manera. Me pregunto si habrá una sola línea, o menor, sólo XAML) código de respuesta a este problema. Hacerlo en el cs de código significa que voy a tener que mover el código del controlador de eventos (la frontera de la animación en este caso) también a los cs.
    • No funciona si IsOpened es ya enlazado.
    • si usted está haciendo esto en el código detrás, debe ser que también acaba de firmar para arriba para el Abierto de eventos en la ventana emergente 🙂
  5. 0

    De La Aplicación.xaml.cs o en otra partida instancia de la clase que usted necesita agregar:

    var field = typeof(PresentationSource).GetField("RootSourceProperty", BindingFlags.NonPublic | BindingFlags.Static);
            var property = (DependencyProperty)field.GetValue(null);
            property.OverrideMetadata(typeof(DependencyObject), new FrameworkPropertyMetadata(property.DefaultMetadata.DefaultValue, OnHwndSourceChanged));

    Donde, RootSourceProperty es campo privado DependecyProperty de PresentationSource. Su uso de la propiedad, cuando HwndSource se crea y se establece RootVisual. Tan sólo se necesita el uso de la propiedad cambió de llamar a la espalda de RootSourceProperty:

    private static void OnHwndSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
    
        }

    Esto es bueno porque, se puede usar en todas las Aplicaciones y para todos los HwndSource (Popup, Window o controles Personalizados, en los que se utilizan HwndSource)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea