Silverlight - Отправка переменных между кадрами

У меня есть одна главная страница в моем проекте Silverlight. У меня есть две рамки внутри этой страницы. Один называется «Содержание», а другой - «Нижний колонтитул». Что меня интересует, как я могу изменить переменные в содержимом Content в зависимости от того, является ли это событием щелчка в нижнем колонтитуле?

В Mainpage.xaml:

<UserControl
    x:Class="SilverlightApplication10.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.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="640" d:DesignHeight="480">



        <Grid x:Name="NavigationGrid" >

            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
        <navigation:Frame Grid.Row="1" x:Name="Contents" 
                              Source="/Home" Navigated="ContentFrame_Navigated" NavigationFailed="ContentFrame_NavigationFailed">
            <navigation:Frame.UriMapper>
                <uriMapper:UriMapper>
                    <uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
                    <uriMapper:UriMapping  Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>
                </uriMapper:UriMapper>
            </navigation:Frame.UriMapper>
        </navigation:Frame>

        <StackPanel Grid.Row="2" Background="Silver" Width="528">
            <navigation:Frame Grid.Row="1" x:Name="Footer" 
                              Source="/Home" Navigated="ContentFrame_Navigated" NavigationFailed="ContentFrame_NavigationFailed">
                <navigation:Frame.UriMapper>
                    <uriMapper:UriMapper>
                        <uriMapper:UriMapping Uri="" MappedUri="/Footer/Home.xaml"/>
                        <uriMapper:UriMapping  Uri="/{pageName}" MappedUri="/Footer/{pageName}.xaml"/>
                    </uriMapper:UriMapper>
                </navigation:Frame.UriMapper>
            </navigation:Frame>
        </StackPanel>
    </Grid>

</UserControl>

В /Views/Page2.xaml:

<navigation:Page x:Class="PodcastPlayer.Page2"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Page2 Page">
  <Grid x:Name="LayoutRoot">
        <MediaElement x:Name="player"   />
    </Grid>
</navigation:Page>

В /Footer/Page2.xaml:

<navigation:Page x:Class="PodcastPlayer.Page2Fotter"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Page2 Page">
  <Grid x:Name="LayoutRoot">
        <StackPanel  Orientation="Horizontal" >
            <StackPanel Height="30" Width="60" Background="Red">
                <TextBlock Padding="10" Foreground="White">Back</TextBlock>
            </StackPanel>

            <StackPanel Height="30" Width="60" Margin="10,0,0,0" Background="DarkGreen">
                <TextBlock x:Name="playtext" Padding="10" Foreground="White">Play</TextBlock>
            </StackPanel>

            <StackPanel Height="30" Width="60"  Margin="10,0,0,0" Background="Red">
                <TextBlock Padding="10" Foreground="White">Next</TextBlock>
             </StackPanel>   
        </StackPanel>
    </Grid>
</navigation:Page>

Я хочу, чтобы при нажатии кнопки «Воспроизвести» в нижнем колонтитуле проигрыватель удалял этот элемент мультимедиа в разделе «Содержание».

player.Play()

Программа, которую я пишу, написана на VB.NET. Но примеры с C # тоже принимаются с большой благодарностью!


person eriksv88    schedule 27.12.2009    source источник


Ответы (2)


Вы можете хранить игрока в каком-нибудь статическом поле вроде этого:

public class DataClass
{
    public static MediaElement player;
}

Таким образом, вы сможете начать воспроизведение откуда угодно:

DataClass.player.Play();
person Fedor    schedule 05.01.2010

Самая сложная часть обработки этого через структуру навигации - получение соответствующего дескриптора для различных пользовательских элементов управления, к которым осуществляется переход. Я бы порекомендовал обработать событие Navigated в различных элементах управления навигацией, а затем получить ссылку на нужный элемент управления из свойства Content объекта NavigationEventArgs. Таким образом, вы можете вызвать любой метод, который вам нужен, в соответствующем экземпляре рассматриваемого пользовательского элемента управления.

Я применил аналогичный подход в своем ответе на этот вопрос.

Конечно, вы также можете подумать, действительно ли вам нужны дополнительные сложности фреймворка навигации для этого конкретного решения. По крайней мере, на первый взгляд, я не понимаю, почему вам действительно нужно переходить к этим конкретным элементам управления. Возможно, удастся просто разместить их прямо в MainPage.xaml, а затем вы сможете довольно легко получить их с помощью FindName ().

person Ken Smith    schedule 28.12.2009
comment
Что я мог бы сделать, это пройти курс и использовать URI для установки хэша, например # play = true. Итак, игрок во втором кадре начал играть = истина, а не ложь. Но я не хочу, чтобы это было видно в URI. - person eriksv88; 28.12.2009
comment
Похоже, что Find Control (). Нет в среде выполнения Silverlight - person eriksv88; 28.12.2009
comment
Ой, извините, это должен был быть FindName (). Обновлено выше. - person Ken Smith; 29.12.2009