SilverLight 4: переход к различным кадрам в элементе управления SL из Javascript - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть элемент управления Silverlight, на котором есть рамка.Я хочу изменить URI этого кадра за пределами элемента управления SL.(У меня есть HTML-ссылка, которая будет использовать Javascript для явного указания изменения элемента управления SL.) Это все работает, но я получаю случайные ошибки JavaScript.

Мастер-страница:

<html>
<body>
    <a href="#" onclick="PdmcNav.NavigateTo('page1');">Page 1 Link</a> 
    <a href="#" onclick="PdmcNav.NavigateTo('page2');">Page 2 Link</a> 

    <div id="main" >
        <asp:ContentPlaceHolder ID="MainContent" runat="server">
        </asp:ContentPlaceHolder>
    </div>
</body>
</html>

ВключеноJavascript:

// Defining the namespace object for the Pdmc navigation
var PdmcNav = {};
PdmcNav.PdmcSLControl = null;

PdmcNav.NavigateTo = function (pagename) {

    // check to see if PDMC Silverlight control is on page. if not (is null), then need to load main PDMC page
    if (PdmcNav.PdmcSLControl == null) {
        // handle this later
    } else {
        // Pdmc SL control on page.. 
        // Talk to silverlight control and request it to navigate to pagename
        PdmcNav.PdmcSLControl.Content.PdmcSL.NavigateToPage(pagename);
    }
}

Главная страница Xaml, загруженная в главную страницу (MainNavigationView.xaml)

<UserControl x:Class="PDMC.Views.MainNavigationView"
             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"
             xmlns:toolkit="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit"
             xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
             xmlns:navigationCore="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
             mc:Ignorable="d">
    <StackPanel>
        <!-- this is a test of navigation in the control.... works flawlessly -->
        <StackPanel Orientation="Horizontal">
            <HyperlinkButton Content="profile" Margin="4" TargetName="contentFrame" NavigateUri="/Views/SupplierProfile.xaml"/>
            <HyperlinkButton Content="scores" Margin="4" TargetName="contentFrame" NavigateUri="/Views/SupplierScores.xaml"/>
        </StackPanel>
        <navigation:Frame x:Name="contentFrame"
                          Source="/Views/Profile.xaml"
                          VerticalAlignment="Stretch"
                          HorizontalAlignment="Stretch" />
    </StackPanel>
</UserControl>

MainNavigationView.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Browser;
using System;

namespace PDMC.Views {
    public partial class MainNavigationView : UserControl {
        /// <summary>
        /// Initializes a new instance of the MainNavigationView class.
        /// </summary>
        public MainNavigationView() {
            InitializeComponent();

            HtmlPage.RegisterScriptableObject("PdmcSL", this);
        }

        [ScriptableMember]
        public void NavigateToPage(string pageName) {

            if (pageName == "Profile") {
                Uri x = new Uri(@"/Views/Profile.xaml", System.UriKind.RelativeOrAbsolute);
                contentFrame.Source = x;//.Navigate(x);
            } else if (pageName == "Scores") {
                Uri x = new Uri(@"/Views/Scores.xaml", System.UriKind.RelativeOrAbsolute);
                contentFrame.Source=x;//.Navigate(x);
            }
        }
    }
}

Я могу нажать нассылки на главной странице несколько раз, но после нескольких щелчков назад и вперед я получаю следующую ошибку: (случайно, когда я получаю это)

Message: Unhandled Error in Silverlight Application Content for the URI cannot be loaded. The URI may be invalid.
Parameter name: uri   at System.Windows.Navigation.NavigationService.NavigateCore(Uri uri, NavigationMode mode, Boolean suppressJournalAdd, Boolean isRedirect)
   at System.Windows.Navigation.NavigationService.Journal_Navigated(Object sender, JournalEventArgs args)
   at System.Windows.Navigation.Journal.OnNavigated(String name, Uri uri, NavigationMode mode)
   at System.Windows.Navigation.Journal.UpdateObservables(JournalEntry currentEntry, NavigationMode mode)
   at System.Windows.Navigation.Journal.AddHistoryPoint(JournalEntry journalEntry)
   at System.Windows.Navigation.Journal.AddHistoryPointIfDifferent(String newState)
   at System.Windows.Navigation.Journal.Browser_Navigated(Object sender, EventArgs eventArgs)
   at System.Windows.Navigation.Journal.<>c__DisplayClass3.<InitializeNavigationState>b__2(Object sender, NavigationStateChangedEventArgs args)
   at System.Windows.Interop.SilverlightHost.RaiseNavigationStateChanged(String oldState, String newState)
   at System.Windows.Interop.SilverlightHost.OnNavigationStatePollingTick(Object sender, EventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

Кто-нибудь видит, что я делаю неправильно?

1 Ответ

1 голос
/ 07 апреля 2011

Похоже, что решение моей проблемы - изменить мой подход.Во время моего исследования я обнаружил, что для элемента Frame в Main.xaml по умолчанию JournalOwnership установлено на Automatic.Если я установлю это на OwnsJournal, проблема исчезнет.По-видимому, если во фрейме используется журнал браузера, странные вещи случаются, если вы переходите через [ScriptableMethod].

. Мое решение состояло в том, чтобы изменить мой подход к проблеме…просто и элегантноСтоит отметить, что когда журналом управляет браузер (JournalOwnership=Automatic), вы можете переходить на страницы, находящиеся под вашим контролем, просто используя URL.

Вот решение, которое я выбрал и которое позволяет мнеиметь HTML-навигацию (вне моего элемента управления silverlight), которая будет переходить на другие страницы в моем элементе управления SL.

Мастер-страница (простой HTML со ссылками на навигацию)

<html>
<body>
    <asp:HyperLink ID="HyperLink4" runat="server" NavigateUrl="~/PDMC.aspx#Profiles">Profiles</asp:HyperLink>
    <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/PDMC.aspx#Scores">Scores</asp:HyperLink>
</body>
</html>

Обратите внимание, PDMC.aspx - это простая страница, которая содержит мой объект управления silverlight.

Main.xaml - это RootVisual моего элемента управления silverlight.Он просто содержит фрейм, который мы будем использовать для смены представлений:

<navigation:Page x:Class="PDMC.Views.Main" 
    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="Main Page">    
        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
            <StackPanel x:Name="LayoutRoot">
                <navigation:Frame x:Name="MainFrame" 
                                  Source="/Views/Profile.xaml"
                                  JournalOwnership="Automatic"
                                  UriMapper="{StaticResource PDMC_UriMapper}" />
            </StackPanel>
        </ScrollViewer>
</navigation:Page>

Наконец, чтобы сделать внешние ссылки более простыми и красивыми, я добавил UriMapper в свой App.xaml:

<Application.Resources>
    <navigationCore:UriMapper x:Key="PDMC_UriMapper">
        <navigationCore:UriMapping Uri="Profiles" MappedUri="/Views/Profile.xaml" />
        <navigationCore:UriMapping Uri="Scores" MappedUri="/Views/Scores.xaml" />            
    </navigationCore:UriMapper>
</Application.Resources>

Вот и все ... гораздо более простое решение .. Надеюсь, что это поможет кому-то еще в будущем (и да, я новичок в Silverlight во время этого открытия :))

...