首页 > 解决方案 > 子视图在第二次导航时看起来相同

问题描述

一个页面将 ContentView 作为子级,并且它在其中一个子级的 Tapped 事件上具有来自代码背后的动画。

当我们离开这个页面,然后再次进入它时,

ContentView 仍然应用了最后一个动画,即使它是重新构建的。

我们既可以看到上一个动画的视图,也可以看到它应该是的视图。

我们是否必须处理 ContentView,或者在 Page 的 OnDisappearing 上做些什么?

ContentView 背后的代码:

private async void OnPlaceTapped(object sender, EventArgs e)
    {
        await ExitFocusMode();
    }

    private async void OnDummyBorderTapped(object sender, EventArgs e)
    {
        await EnterFocusMode();
    }

    private async Task EnterFocusMode()
    {
        await Task.WhenAll(
            DummySearchBox.TranslateTo(0, 0, 500),
            DummySearchBox.ScaleXTo(1.2, 500),
            SearchResultsGrid.FadeTo(1, 500),
            DummySearchBox.FadeTo(0, 200)
        );
        SearchResultsGrid.InputTransparent = false;
        DummySearchBox.InputTransparent = true;
        SearchBox.Focus();
    }

    private async Task ExitFocusMode()
    {
        await Task.WhenAll(
            DummySearchBox.FadeTo(1, 200),
            SearchResultsGrid.FadeTo(0, 500),
            DummySearchBox.TranslateTo(30, 24, 500),
            DummySearchBox.ScaleXTo(1, 500)
        );
        SearchResultsGrid.InputTransparent = true;
        DummySearchBox.InputTransparent = false;
        DummySearchBox.Focus();
        SearchBox.Unfocus();
    }

ContentView 的 xaml(部分):

<border:SfBorder x:Name="DummySearchBox"
                         BorderWidth="0"
                         CornerRadius="10"
                         HasShadow="True"
                         InputTransparent="False"
                         ShadowColor="{StaticResource SilverSemiTransparent}"
                         HorizontalOptions="Fill"
                         VerticalOptions="Start"
                         TranslationX="30"
                         TranslationY="24"
                         Margin="0,0,60,0">
            <border:SfBorder.GestureRecognizers>
                <TapGestureRecognizer Tapped="OnDummyBorderTapped" />
                <TapGestureRecognizer Command="{Binding OpenSearchCommand}" />
            </border:SfBorder.GestureRecognizers>
 </border:SfBorder/>

编辑1:

在 BaseViewModel 上执行导航返回命令:

public virtual void OnNavigateBackPressed()
    {
        NavigationService.PopAsync();
    }

从 ViewModel A 执行向前导航命令:

private async Task ContinueCommandExecute()
    {
        await IOC.Resolve<INavigationService>().NavigateToAsync<ViewModelB>();
    }

导航服务 NavigateToViewModel 实现:

Page page = CreatePage(viewModelType, parameter);
            if (root)
            {
                if (Application.Current.MainPage is NavigationPage mainPage)
                {
                    for (int i = 0; i < mainPage.Navigation.NavigationStack.Count - 1; i++)
                    {
                        var pageToNotify = mainPage.Navigation.NavigationStack[i];
                        if (pageToNotify.BindingContext is InfraViewModelBase viewModelBaseToDestory)
                            await viewModelBaseToDestory.OnDestroyAsync();
                    }
                }
                Application.Current.MainPage = new NavigationPage(page);
            }
            else
            {
                if (Application.Current.MainPage is NavigationPage navigationPage)
                {
                    await navigationPage.PushAsync(page);
                }
                else
                {
                    Application.Current.MainPage = new NavigationPage(page);
                }
            }

            if (page.BindingContext is InfraViewModelBase viewModelBase)
                await viewModelBase.InitializeAsync(parameter);

标签: xamarin.forms

解决方案


推荐阅读