Как @Louis сказал, что это вызвано оптимизациями v8. Вы можете перемещать стек вызовов в кадр, где эта переменная видна:
Или заменить debugger
на
eval('debugger');
eval
отключит текущий кусок
Во-первых ... Кредит на этот ответ поступает в Эрик Берк . Он ответил Это самый вопрос, размещенный в группе учеников 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 Наведите курсор по сравнению с проверкой флажок, как он его имел. Все в попытке заставить всплывающее окно вести себя немного похоже на всплеск.
Вставленные графики ответов: хорошо, но может не применяться в вашем случае, потому что он оставляет анимацию прикрепленной к свойству 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, потому что это может происходить, когда над ним появляется всплывающее окно. В некоторых ситуациях это могло привести к появлению мерцающего всплывающего окна. Так что вам понадобится логика.
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();
}