Как я могу открыть всплывающее окно WPF с задержкой?

Как @Louis сказал, что это вызвано оптимизациями v8. Вы можете перемещать стек вызовов в кадр, где эта переменная видна:

Или заменить debugger на

eval('debugger');

eval отключит текущий кусок

13
задан Dave Clemmer 16 September 2011 в 04:57
поделиться

3 ответа

Во-первых ... Кредит на этот ответ поступает в Эрик Берк . Он ответил Это самый вопрос, размещенный в группе учеников WPF. Я думал, что было бы полезно поставить этот ответ на Stackoverflow тоже.

В основном необходимо оживить свойство Isopen всплывающего окна с дискретингом.

Проверьте следующий XAML (который можно легко вставить в Kaxaml или другое свободные утилиты редактирования XAML):

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
    <ContentPresenter>
        <ContentPresenter.ContentTemplate>
            <DataTemplate>
                <Grid>
                    <CheckBox
                        x:Name="cb"
                        Width="100"
                        Height="40"
                        Content="Hover Over Me"
                    />
                    <Popup
                        x:Name="popup"
                        Placement="Bottom"
                        PlacementTarget="{Binding ElementName=cb}"
                    >
                        <Border Width="400" Height="400" Background="Red"/>
                    </Popup>
                </Grid>
                <DataTemplate.Triggers>
                    <Trigger SourceName="cb" Property="IsMouseOver" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard x:Name="bsb">
                                <Storyboard>
                                    <BooleanAnimationUsingKeyFrames
                                        Storyboard.TargetName="popup"
                                        Storyboard.TargetProperty="IsOpen"
                                        FillBehavior="HoldEnd"
                                    >
                                        <DiscreteBooleanKeyFrame KeyTime="0:0:0.5" Value="True"/>
                                     </BooleanAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <StopStoryboard BeginStoryboardName="bsb"/>
                        </Trigger.ExitActions>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ContentPresenter.ContentTemplate>
    </ContentPresenter>
</Page>

Обратите внимание, что я слегка изменил его оригинальное решение ... для того, чтобы вызвать isOpen Наведите курсор по сравнению с проверкой флажок, как он его имел. Все в попытке заставить всплывающее окно вести себя немного похоже на всплеск.

8
ответ дан 1 December 2019 в 20:00
поделиться

Вставленные графики ответов: хорошо, но может не применяться в вашем случае, потому что он оставляет анимацию прикрепленной к свойству IsOpen, эффективно блокируя ее на месте и предотвращая ее изменение с помощью прямой настройки свойства, привязки и других способов. Это может затруднить использование вашего кода, в зависимости от того, как вы его используете.

Если это так, я бы переключился на запуск DispatcherTimer, когда вы хотите открыть всплывающее окно после некоторой задержки, например:

_popupTimer = new DispatcherTimer(DispatcherPriority.Normal);
_popupTimer.Interval = TimeSpan.FromMilliseconds(100);
_popupTimer.Tick += (obj, e) =>
{
  _popup.IsOpen = true;
};
_popupTimer.Start();

Для поведения, подобного всплывающей подсказке, это можно сделать с помощью MouseEnter. Если вы хотите отменить открытие всплывающего окна по какой-либо причине (например, если мышь покидает элемент управления до появления всплывающего окна), просто:

_popupTimer.Stop();

Обновить

Как указано в комментариях, вы также захотите установить _popup.IsOpen = false в некоторых ситуациях в событии MouseLeave, в зависимости от вашей логики обработки событий входа / выхода мыши между вашим элементом управления и всплывающим окном. Имейте в виду, что обычно вы не хотите слепо устанавливать IsOpen = false для каждого события MouseLeave, потому что это может происходить, когда над ним появляется всплывающее окно. В некоторых ситуациях это могло привести к появлению мерцающего всплывающего окна. Так что вам понадобится логика.

10
ответ дан 1 December 2019 в 20:00
поделиться
System.Windows.Controls.ToolTip tp = new System.Windows.Controls.ToolTip();

System.Windows.Threading.DispatcherTimer tooltipTimer =
    new System.Windows.Threading.DispatcherTimer
    (
        System.Windows.Threading.DispatcherPriority.Normal
    );

private void TooltipInvalidCharacter()
{
    tp.Content =
        "A flie name cannot contain any of the following character :" +
        "\n" + "\t" + "\\  / : *  ?  \"  <  >  |";

    tooltipTimer.Interval = TimeSpan.FromSeconds(5);
    tooltipTimer.Tick += new EventHandler(tooltipTimer_Tick);
    tp.IsOpen = true;
    tooltipTimer.Start();       
}

void tooltipTimer_Tick(object sender, EventArgs e)
{
     tp.IsOpen = false;
     tooltipTimer.Stop();
}
0
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: