Как реализовать вкладку в виде меню на всех страницах приложения, без повторного написания одного и того же кода - PullRequest
0 голосов
/ 19 июля 2011

Мне нужно меню в моем приложении, которое сохраняется на разных страницах. Один из способов добиться этого - объявить макет меню и обработчики событий на каждой странице приложения, но это было бы плохой практикой.

Я попытался реализовать страницу, которая объявляет меню и обработчики событий, а затем наследует все остальные, как в примере ниже от http://social.msdn.microsoft.com/Forums/en/windowsphone7series/thread/6c30d7e5-741f-4ce7-8306-72cae73d7ff4,, но кажется, что он не будет работать для обработчиков событий. Кто-нибудь имеет опыт работы с этим или знает другие подходы, которые работают лучше?

<InheritedPage:PhoneApplicationPageDerived 
    x:Class="InheritedPage.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:InheritedPage="clr-namespace:InheritedPage;assembly=InheritedPage"
    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}">

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitleGrid is the name of the application and page title-->
        <Grid x:Name="TitleGrid" Grid.Row="0">
            <TextBlock Text="MY APPLICATION" x:Name="textBlockPageTitle" Style="{StaticResource PhoneTextPageTitle1Style}"/>
            <TextBlock Text="page title" x:Name="textBlockListTitle" Style="{StaticResource PhoneTextPageTitle2Style}"/>
        </Grid>

        <!--ContentGrid is empty. Place new content here-->
        <Grid x:Name="ContentGrid" Grid.Row="1">
            <Button Content="Virtual" Height="70" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="160" Click="SomeVirtualMethod" />
            <Button Content="Base" Height="70" HorizontalAlignment="Left" Margin="320,0,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="SomeBaseMethod" />
        </Grid>
    </Grid>

</InheritedPage:PhoneApplicationPageDerived>





using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Diagnostics;

namespace InheritedPage {

    public class PhoneApplicationPageBase : PhoneApplicationPage {

        public PhoneApplicationPageBase() {
        }

        public virtual void SomeVirtualMethod(object sender, RoutedEventArgs e) {
            Debug.WriteLine("PhoneApplicationPageBase Virtual Method");
        }

    }

    public class PhoneApplicationPageDerived : PhoneApplicationPageBase {

        public PhoneApplicationPageDerived() {
        }

        public override void SomeVirtualMethod(object sender, RoutedEventArgs e) {
            Debug.WriteLine("PhoneApplicationPageDerived Override Method");
        }

    }

    public partial class MainPage : PhoneApplicationPageDerived {
        public MainPage() {
            InitializeComponent();

            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
        }


        // 1. COMMENT OUT THIS METHOD DECLARATION to see virtual inherited methods 
        // break Application.LoadComponent in the generated MainPage.g.cs

        public override void SomeVirtualMethod(object sender, RoutedEventArgs e) {
            Debug.WriteLine("MainPage Override Method");
        }


        // 2. MOVE THIS METHOD DECLARATION into PhoneApplicationPageBase to see non virtual inherited 
        // methods break Application.LoadComponent in the generated MainPage.g.cs

        public void SomeBaseMethod(object sender, RoutedEventArgs e) {
            Debug.WriteLine("PhoneApplicationPageBase Base Method");
        }


    }
}

1 Ответ

0 голосов
/ 19 июля 2011

Будьте осторожны, изобретая действительно пользовательский интерфейс в Silverlight ... Microsoft очень разборчива в отношении внешнего вида приложений Silverlight.Очевидно, они гораздо более щадящие приложения XNA.

Чтобы ответить на ваш вопрос, мой подход заключается в том, чтобы объявить статический класс, содержащий элементы меню в постоянном меню, а затем создать пользовательский элемент управления, которыйзаполняет себя, получая доступ к этим статическим данным.Затем просто добавьте один из этих элементов управления на каждую страницу, где вы хотите, чтобы она сохранялась.

У меня такое чувство, что MS откажется от этого, но вы определенно можете сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...