关于 c#:WP8 如何创建基本页面

WP8 how to create base-page & use it

我已经google了,但没有得到任何有用的资源,所以我决定问。

问题:

我有一个 Windows Phone 8 C#/XAML .NET 4.5 应用程序,它将有几个页面 (15 - 50),它们都将具有相似的外观相同的数据上下文设置为 ViewModel 的一个实例:

1
2
3
4
5
6
7
8
9
10
11
    --------------------------
    |logo         usermenu(v)|
    --------------------------
    |                        |
    |                        |
    |                        |
    |     ..variable..       |
    |     ..content...       |
    |                        |
    |                        |
    --------------------------

问题:

我在这件事上找不到任何有用的东西,有人能解释一下怎么做吗?

(我是一个菜鸟——意思是我很感谢任何有用的信息,但更多的是对傻瓜的解释)

  • 如何创建一个基页/祖先来派生我的页面?

  • 有没有办法在祖先中设置数据上下文?

  • 如何使用那个基本页面/祖先?

P.S.:如果您想知道为什么我想要具有相同数据上下文的页面,在我之前问过的这个问题中有更多关于它的文章


听起来你可能在这里采取了错误的方法。

与其拥有 15-50 个具有相同数据上下文的相同页面,不如使用一页并改变 DataContext。这将比拥有大量来自同一个基础的页面要简单得多。
当然,这取决于您的实际内容的可变性。

就您的具体问题而言:

  • 页面和其他任何类一样是类,因此继承的定义方式相同。只需确保在 csxaml 文件中指定了祖先。

  • 您不能将祖先中的数据上下文设置为与实际实例不同,如果您只是将其设置在祖先中,它将对实例不可用。您需要在实例中设置 DataContext。

  • 类似这样的:

一个非视觉的(稍后会详细介绍)基本页面

1
2
3
4
5
6
7
8
namespace SO19398590
{
    using Microsoft.Phone.Controls;

    public class MyBasePage : PhoneApplicationPage
    {
    }
}

继承自此的实际页面。
cs:

1
2
3
4
5
6
7
public partial class MainPage : MyBasePage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

xaml(部分):

1
2
3
4
5
6
7
8
9
10
11
12
<so19398590:MyBasePage
    x:Class="SO19398590.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:so19398590="clr-namespace:SO19398590"
    SupportedOrientations="Portrait">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <!-- put stuff here -->
   </Grid>

</so19398590:MyBasePage>

请注意,这是一个没有视觉效果的基本页面,我知道您要求从基类继承视觉效果。
不幸的是,在视觉页面继承方面,Windows Phone 的故事非常糟糕。工具(设计师)不喜欢它,而且很容易陷入难以诊断的问题。

更好的方法是使用一个页面的[多个实例],但根据您要显示的数据加载不同的用户控件。
一个稍微复杂一点但仍然允许标准页面导航体验的替代方法是使用自定义 PhoneApplicationFrame 并在其中包含常见的 UI 元素。

抱歉,这是一个相当笼统的答案,但"最佳"解决方案将取决于您定义为"可变内容"的空间中的实际情况。


在我看来,最好的方法是创建一个包含您的徽标和用户菜单的 UserControl。然后在每个页面中包含该 UserControl。