我一直在尝试将单个WP7应用页面分成两个单独的页面,以便我可以将功能保留在一个页面中,将视图保留在另一个页面中。基本上我正在创建一个带标签的webbrowser,其中我有不同的选项卡,可以根据用户请求查看,只有当前单击的选项卡是视图中显示的选项卡。到目前为止,我有一个解决方案,它在一个页面中工作,但我想将其分为TabsPage(它将控制选项卡实例)和MainPage(它将向用户显示当前选定的选项卡以供显示)。我不确定如何正确分离这两个页面,以便我可以完成此功能。我所拥有的如下(迄今为止有效)
MainPage.xaml中
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox x:Name="UrlTextBox" KeyDown="UrlTextBox_KeyDown" InputScope="url"/>
<Grid x:Name="BrowserHost" Grid.Row="1" />
<!--<my:FullWebBrowser Name="TheBrowser" Grid.Row="1"/>-->
</Grid>
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar>
<shell:ApplicationBarIconButton x:Name="Tabs" IconUri="/Images/appbar.tab.rest.png" Text="tabs" Click="TabsPage_Click"/>
<shell:ApplicationBarIconButton IconUri="/Images/appbar.next.rest.png" IsEnabled="True" Text="forward" x:Name="ForwardBtn" Click="ForwardBtn_Click"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="1" Click="TabMenuItem_Click" />
<shell:ApplicationBarMenuItem Text="2" Click="TabMenuItem_Click" />
<shell:ApplicationBarMenuItem Text="3" Click="TabMenuItem_Click" />
<shell:ApplicationBarMenuItem Text="4" Click="TabMenuItem_Click" />
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
MainPage.xaml.cs中
private const int NumTabs = 4;
private int currentIndex;
private string[] urls = new string[NumTabs];
////private WebBrowser[] browsers = new WebBrowser[NumTabs];
private FullWebBrowser[] browsers = new FullWebBrowser[NumTabs];
// Constructor
public MainPage()
{
InitializeComponent();
ShowTab(0);
}
//protected override void OnNavigatedTo(NavigationEventArgs e)
//{
// base.OnNavigatedTo(e);
//}
private void ShowTab(int index)
{
this.currentIndex = index;
UrlTextBox.Text = this.urls[this.currentIndex] ?? "";
if (this.browsers[this.currentIndex] == null)
{
//WebBrowser browser = new WebBrowser();
FullWebBrowser browser = new FullWebBrowser();
this.browsers[this.currentIndex] = browser;
BrowserHost.Children.Add(browser);
}
for (int i = 0; i < NumTabs; i++)
{
if (this.browsers[i] != null)
{
this.browsers[i].Visibility = i == this.currentIndex ? Visibility.Visible : Visibility.Collapsed;
}
}
}
private void UrlTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
Uri url;
//string _url;
if (Uri.TryCreate(UrlTextBox.Text, UriKind.Absolute, out url))
{
this.urls[this.currentIndex] = UrlTextBox.Text;
//_url = url.ToString();
string _url = url.ToString();
//this.browsers[this.currentIndex].Navigate(url);
this.browsers[this.currentIndex].Navigate(_url);
}
else
MessageBox.Show("Invalid url");
}
}
private void TabMenuItem_Click(object sender, EventArgs e)
{
int index = Int32.Parse(((ApplicationBarMenuItem)sender).Text) - 1;
ShowTab(index);
}
//**********************************************************************
private void TabsPage_Click(object sender, EventArgs e)
{
this.NavigationService.Navigate(new Uri("/TabsPage.xaml", UriKind.Relative));
}
注意:我正在使用名为TheWebBrowser的webbrowser控件。 任何有关如何正确分离MainPage到TabsPage的帮助将不胜感激!我已经研究了一段时间,似乎无法在页面之间正确传递数据(即命名为搜索栏和要在MainPage上查看的当前webbrowser实例)。
答案 0 :(得分:1)
通过在App.xaml.cs文件中添加保存点,然后您可以使用
访问信息,可以在Pages之间传递值并仍然遵循正确的WP7设计(App.Current as App).SomeField
现在我没有使用您正在使用的webbrowser控件的经验,但我假设您可以使用MVVM模式将数据与视图分开。 This就是一个很好的例子。使用MVVM还可以使用您的应用程序better support tombstoning。希望这能回答你的问题。
答案 1 :(得分:1)
我只想使用Caliburn Micro在页面/屏幕之间传递数据。 http://caliburnmicro.codeplex.com/它还有一个很好的文档,让您开始学习如何正确传递数据而不是(App.Current as App).SomeField。
答案 2 :(得分:0)
以防万一,this can be helpful。
编辑:我的意思是,你可以使用this component,这可以通过Nuget获得
Install-Package SmartNavigation.
可能它有点原始,但完全值得一瞥。
答案 3 :(得分:0)
这就是我想要跨页面共享数据的方法。在App.xaml.cs中定义您的属性(不要忘记在任何需要的地方初始化):
public List<Contact> Contacts
{
get
{
return _contacts;
}
}
现在,在您要使用此数据的页面中,按以下方式定义:
private List<Contact> Contacts
{
get
{
return (App.Current as App).Contacts;
}
}