2011-04-06 52 views
0

我有一个Silverlight控件,它有一个框架。我想从SL控件外部更改此帧的URI。 (我有一个HTML链接,它将使用Javascript来最终告诉SL控件改变。)这是所有的工作,但我得到随机的JavaScript错误。SilverLight 4:从Javascript导航到SL控件中的不同框架

母版页:

<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

看来我的问题的解决方案是改变我的方法。在我的研究中,我发现Main.xaml中的Frame元素,默认JournalOwnership设置为Automatic。如果我将此设置为OwnsJournal,问题就会消失。显然,如果该框架正在使用浏览器日志,如果您通过[ScriptableMethod]导航,则会发生奇怪的事情。

我的解决方案是改变我对待问题的方法....最终变得更加简单和优雅。有一点需要注意的是,当日志由浏览器管理时(JournalOwnership=Automatic),只需使用URL即可导航至控件中的页面。

下面是我最终的解决方案,它允许我在我的SL控件中导航到不同页面的HTML导航(在我的silverlight控件之外)。

母版页(纯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是我Silverlight控件的RootVisual。它只是包含了我们将用它来换出的观点框架:

<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> 

这它..一个更简单的解决方案..希望这可以帮助其他人在路上(是的,我是在这个发现时银光新:))

+0

我也有类似的要求。我在我的Main.Xaml中也有一个框架(我将它命名为“abc”) 这就是我创建silverlight对象的方式。 Silverlight.createObject( “ClientBin/InSite.Shell。xap“,//源 document.getElementById('silverlightControlHost'),//父元素 ”insiteSilverLight“,//生成的对象元素的ID为 { 宽度:”100%“,高度:”100%“,背景: “白”, 版本: “4.0.60310.0” },{ 的onLoad:onSLLoad} ); – lohiarahul 2016-07-04 13:41:33

+0

我上加载事件发件人 功能onSLLoad(发件人,EventArgs){ VAR rootFrame = sender.children [0]; } \t \t \t \t我希望在此框架上调用.NavigateTo('#my/path')。但是我不能。我如何得到孩子的类型。它只是作为HtmlParamElement返回,我不能确定它是否是我要求的框架。 \t \t \t \t如何解析DOM并执行NavigateTo()方法? – lohiarahul 2016-07-04 13:41:43

相关问题