xamarin.forms - 子视图在第二次导航时看起来相同
问题描述
一个页面将 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);
解决方案
推荐阅读
- python - 如何根据列组合对行进行排序 - python
- python - 通过匹配列值更新 DataFrame 索引
- javascript - 如果在 JQuery 模式对话框上单击转义键,如何将用户发送到主页
- split - 无法从拆分和空白修剪中获取数据
- php - 我正在尝试在 wordpress 中制作插件,但 php echo 没有解析 html 标签
- visual-studio-code - 如何在 Visual Studio Code 中同时启用 FiraCode 连字和样式集?
- python - 如何将`bbox_to_anchor`的前两个参数设置为左上坐标?
- javascript - Why do I not get redirected to /login when accessing a secure page?
- javascript - 如何使用节点 mysql 驱动程序存储序列化数组
- github - showing 404 error file not found in GitHub publish when come back to my project