UWP получить уведомление об изменении визуального состояния в пользовательских средствах массовой информации - PullRequest
0 голосов
/ 17 ноября 2018

в моем приложении 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 никогда не запускается.

1 Ответ

0 голосов
/ 19 ноября 2018

В моих пользовательских элементах управления я отписывался от всех событий, связанных с моими пользовательскими элементами управления мультимедиа, в событии UnLoaded элементов управления мультимедиа (включая ControlsFade_CurrentStateChanged), и, как выясняется, когда элементы управления переходят в полноэкранный режим, Unloaded событие запущено, поэтому оно удалило подписку на это событие и, следовательно, после этого не запускалось.поэтому я закомментировал незагруженное событие, и теперь оно работает как положено.

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

...