в моем приложении uwp у меня есть пользовательские элементы управления переносом мультимедиа, и я хочу получать уведомления всякий раз, когда мои элементы управления появляются и исчезают с экрана, чтобы я мог сопоставить появление и исчезновение курсора вместе с ним.
это то, что я пробовал до сих пор:
Из generic.xaml в своем стиле элементов управления я обнаружил следующую VisualStateGroup, которая управляет постепенным исчезновением и постепенным исчезновением элементов управления.
<VisualStateGroup x:Name="ControlPanelVisibilityStates">
<VisualState x:Name="ControlPanelFadeIn">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
<EasingDoubleKeyFrame KeyTime="0" Value="0" />
<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetProperty="Y" Storyboard.TargetName="TranslateVertical" From="50" To="0.5" Duration="0:0:0.3" />
</Storyboard>
</VisualState>
<VisualState x:Name="ControlPanelFadeOut">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
<EasingDoubleKeyFrame KeyTime="0" Value="1" />
<EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0" />
</DoubleAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
<DiscreteObjectKeyFrame KeyTime="0" Value="False" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetProperty="Y" Storyboard.TargetName="TranslateVertical" From="0.5" To="50" Duration="0:0:0.7" />
</Storyboard>
</VisualState>
</VisualStateGroup>
Поэтому я подумал, что должен получить эту группу в своем методе OnApplyTemplate, а затем назначить ему событие измененного состояния.
protected override void OnApplyTemplate()
{
//other irrelivent code
ControlsFade = (VisualStateGroup)GetTemplateChild("ControlPanelVisibilityStates");
ControlsFade.CurrentStateChanged +=
ControlsFade_CurrentStateChanged;
base.OnApplyTemplate();
}
public class ControlFadeChangedEventArgs
{
public bool Appeared { get; set; }
}
public event EventHandler<ControlFadeChangedEventArgs> ControlFadeChanged;
private void ControlsFade_CurrentStateChanged(object sender, VisualStateChangedEventArgs e)
{
bool fadein = false;
if (e.NewState.Name == "ControlPanelFadeIn")
fadein = true;
ControlFadeChanged?.Invoke(this, new ControlFadeChangedEventArgs { Appeared = fadein });
}
Я все это связал, и на странице ведется дальнейшая логика, что в данном случае не имеет значения. Я отладил с точкой останова и обнаружил, что ControlsFade_CurrentStateChanged никогда не запускается.
В моих пользовательских элементах управления я отписка всех событий, связанных с моим контролем пользовательских средств массовой информации в ненагруженном случае управления медиа ( в том числе ControlsFade_CurrentStateChanged) и, как выясняется, когда управление идти в полноэкранном режим, ненагруженное событие инициируется так удалил подписку к этому событию и, следовательно, он не стрелял после этого. поэтому я закомментировал незагруженное событие, и теперь оно работает как положено.
Отмена подписки на события важна для предотвращения утечек памяти, пожалуйста, дайте мне знать в комментариях, как я могу отписаться, не вызывая эту проблему.
VisualState
?