【问题标题】:pivot application windows phone 8.1 navigation透视应用程序 windows phone 8.1 导航
【发布时间】:2015-08-03 05:17:11
【问题描述】:

我正在为我的公司开发一个 Windows Phone 应用程序。

我刚刚在基本页面中手动创建了数据透视项。除了后退按钮导航外,该应用程序运行良好。当我点击一个数据透视项目内的任何按钮时,它会导航到所需的页面,但是当我点击返回按钮时,它总是导航到数据透视项目 1,而不是点击事件的来源。

我的 XAML 看起来像这样

<Grid x:Name="ContentRoot"><Pivot x:Name="Test" Title="test book" FontSize="{ThemeResource TextStyleExtraLargeFontSize}">
        <!--Pivot item one-->
        <PivotItem x:Name="pitem1" Header="item1">
     <Grid>
                <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="5*" />
                        <RowDefinition Height="5*" />
                        <RowDefinition Height="5*" />
                    </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>                      
                    <ColumnDefinition Width="10*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="10*"/>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="10*" />
                </Grid.ColumnDefinitions>
                <Button x:Name="bt1" Grid.Row="1" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="1" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderThickness="0" Click="bt1_Click"/>               
                <Button x:Name="bt2" Grid.Row="2" Grid.RowSpan="2" Grid.Column="2" Grid.ColumnSpan="1" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt2_Click"/>             
                <Button x:Name="bt3" Grid.Row="3" Grid.RowSpan="2" Grid.Column="4" Grid.ColumnSpan="1" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt3_Click"/>          
                <Rectangle StrokeThickness="0" Grid.Row="1" Grid.RowSpan="3" Grid.Column="0" Grid.ColumnSpan="11" Stroke="#FF015C1F">            
                </Rectangle>
            </Grid>
        </PivotItem>
        <!--Pivot item one-->
        <PivotItem x:Name="pitem2" Header="item2" >             
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="5*" />
                        <RowDefinition Height="5*" />
                        <RowDefinition Height="5*" />
                        <RowDefinition Height="5*" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="10*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="10*" />
                    </Grid.ColumnDefinitions>
                    <Button x:Name="bt4" Grid.Row="1" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt4_Click"/ >
                <Button x:Name="bt5" Grid.Row="1" Grid.Column="2" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt5_click" />
                </Grid>            
        </PivotItem>
        <!--Pivot item two-->
        <PivotItem x:Name="pitem3" Header="item3">             
            <Grid >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="10*" />
                    <RowDefinition Height="10*" />
                    <RowDefinition Height="10*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="10*" />
                </Grid.ColumnDefinitions>
                <Button x:Name="bt6" Grid.Row="1"  Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt6_Click"/>             
               <Button x:Name="bt7" Grid.Row="1" Grid.Column="2" Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt7_Click"/>              
                <Button x:Name="bt8" Grid.Row="2"  Content="" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Click="bt8_Click" />
              </Grid>
        </PivotItem> 

例如:如果我单击枢轴项目 3 内的“bt7”,它会导航到页面,当我单击返回按钮时,它会导航到枢轴项目 1 而不是项目 3。

我是否遗漏了什么或者问题是我手动创建了数据透视项?

我是 C# 和 XAML 的新手。任何帮助将不胜感激。

更新:

    public home()
    {
        this.InitializeComponent();         
       this.NavigationCacheMode = NavigationCacheMode.Required;
        this.navigationHelper = new NavigationHelper(this);
        this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
        this.navigationHelper.SaveState += this.NavigationHelper_SaveState;
    }
    public NavigationHelper NavigationHelper
    {
        get { return this.navigationHelper; }
    }
    public ObservableDictionary DefaultViewModel
    {
        get { return this.defaultViewModel; }
    }
    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
    }
   private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
    {
    }
    #region NavigationHelper registration
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {   
        this.navigationHelper.OnNavigatedTo(e);
    }
    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        this.navigationHelper.OnNavigatedFrom(e);         
    }
    #endregion
           private async void bt1_Click(object sender, RoutedEventArgs e)
    {
            home obj = new home();
            var result = await obj.GetToken4(sid); 
          if (result.Substring(0, 2) == "No")
            {                    
                MessageDialog msgbox = new MessageDialog("No records found", "e-Book!");
                await msgbox.ShowAsync();                 
            }
            else
            {                  
                this.Frame.Navigate(typeof(firstpage), result);
            }
        }     
    }
    private async Task<string> GetToken4(string sid)
    {
        string postData = "id=" + sid;
        var res = await post4("parameter", postData);
        return res;
    }
    private async Task<string> post4(string url, string postdata)
    {
        var request = WebRequest.Create(new Uri("myurl")) as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/json";
        byte[] data = Encoding.UTF8.GetBytes(postdata);
        //request.ContentLength = data.Length;
        using (var requestStream = await Task<Stream>.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, request))
        {
            await requestStream.WriteAsync(data, 0, data.Length);
        }
        WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
        var responseStream = responseObject.GetResponseStream();
        var sr = new StreamReader(responseStream);
        string received = await sr.ReadToEndAsync();
        return received;
    }
    private async void bt2_Click(object sender, RoutedEventArgs e)
    {
       home obj = new home();
            var result = await obj.GetToken4(sid); 
          if (result.Substring(0, 2) == "No")
            {                    
                MessageDialog msgbox = new MessageDialog("No records found", "e-Book!");
                await msgbox.ShowAsync();                 
            }
            else
            {                  
                this.Frame.Navigate(typeof(secondpage), result);
            }
        }          
    }
    private async Task<string> GetToken5(string sid)
    {
        string postData = "dep=" + sid;
        var res = await post5("parameter1", postData);
        return res;
    }
    private async Task<string> post5(string url, string postdata)
    {
        var request = WebRequest.Create(new Uri("myurl")) as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/json";
        byte[] data = Encoding.UTF8.GetBytes(postdata);
        //request.ContentLength = data.Length;
        using (var requestStream = await Task<Stream>.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, request))
        {
            await requestStream.WriteAsync(data, 0, data.Length);
        }
        WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
        var responseStream = responseObject.GetResponseStream();
        var sr = new StreamReader(responseStream);
        string received = await sr.ReadToEndAsync();
        return received;
    }

} }

【问题讨论】:

    标签: c# windows-phone-8.1 winrt-xaml


    【解决方案1】:

    您的页面在返回时完全重新加载,因此所有控件都将处于默认状态(例如,pivot 在第一个项目上)。

    您可以在 OnNavigatedTo 和 OnNavigatedFrom 方法中保存/恢复状态,或者通过在构造函数中将页面的 NavigationCacheMode 设置为 Enabled 或 Required 来激活页面缓存。

    【讨论】:

    • 我已经尝试在我的 xaml 中启用或要求 NavigationCacheMode。但是当我点击后退按钮时,数据透视项目页面是完全空白的。这就是我所做的&lt;Page x:Class="kvbebook.home" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:kvbebook" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" RequestedTheme="Light" NavigationCacheMode="Enabled"&gt;
    • 我认为它在 Xaml 中不起作用。在构造函数中的 Codebehind 中设置它。那些罕见的怪癖之一......
    • 另外,如果您使用 Enabled,请检查缓存大小(默认情况下,它设置在 app.xaml.cs 中的某处)。
    • 我尝试在页面构造函数中使用this.NavigationCacheMode = NavigationCacheMode.Required;,但在导航回数据透视项目页面时仍然出现空白页面。
    • 请更新您问题中的代码,否则将难以理解。只是为了澄清:您在要保留在内存中的页面上设置 NavigationCacheMode。如果您之后导航到的页面没有显示任何内容,那么这是与您的加载代码有关的另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多