SIlverlight Navigate:它是如何工作的?你将如何在f#w / o VS向导和助手中实现?

时间:2010-05-20 02:29:02

标签: silverlight silverlight-3.0 f#

更新5:brians解决方案有效:

namespace Module1
type Page1() as this =
    inherit UserControl()
    let uriStr = "/FSSilverlightApp;component/Page1.xaml"
    let uri = new System.Uri(uriStr, System.UriKind.Relative)
    do
        Application.LoadComponent(this, uri)

    member public this.Uri with get () = uri

type MyApp() as this =
    inherit Application() 
        do Application.LoadComponent(this, new System.Uri("/FSSilverlightApp;component/App.xaml", System.UriKind.Relative))  

        let nav : Frame = siteTemplate ?  contentFrame
        let p1 = new Module1.Page1() ;

        member this.navigate ea =
             nav.Navigate(p1.Uri)


<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             x:Class="Module1.MyApp">
    <Application.Resources>
    </Application.Resources>
</Application>

<UserControl x:Class="Module1.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="This is page 1 Lets see if we can ever get here!!!" FontSize="24" />
    </Grid>
</UserControl>

更新4:

Brian提到的模板主要是诀窍。我仍然有一个更复杂的页面给我带来麻烦 - 但它很可能是我的代码。一旦我的代码完成,我将发布我可以诊断的内容但部分包括:

  1. 正确设置App.XAML(正确引用您的应用程序对象)
  2. 在构建应用程序对象时使用Application.Load加载App.xaml
  3. 应用对象中创建页面的实例 xaml
  4. 在构建页面对象时使用Application.Load加载单个页面.xaml
  5. 每个页面对象都应该扩展UserControl;我怀疑情况并非如此 - 一旦我获得更复杂的页面运行,我将看到删除此限制是否会产生影响。
  6. 更新3:

    我在Application对象中实现了自己的控制器逻辑,这似乎是诀窍的一部分(无论如何解决了我对原型的需求)。

    type Page1() as this =
        inherit Page()
    
        do
            this.Content <- loadXaml("Page1.xaml")
    
    type MyApp() as this =
        inherit Application()
        let cc = new ContentControl()
    
        let mainGrid : Grid = loadXaml("MainWindow.xaml")
        let siteTemplate : Grid = if mainGrid.Name = "siteTemplate" then mainGrid else mainGrid ?  siteTemplate
        let nav : Frame = siteTemplate ?  contentFrame
    
        let page1  = new Module1.Page1() :> Page ;
        let page2  = new Module1.Page2() :> Page ;
        let page3  = new Module1.Page3() :> Page ;
    
        do
            this.Startup.Add(this.startup)
    
            // to be able to get focus
            cc.IsTabStop <- true
            cc.IsEnabled <- true
    
            System.Windows.Browser.HtmlPage.Plugin.Focus()
            cc.Content <- mainGrid
            this.RootVisual <- cc
    
        member this.startup ea = 
            menu.MenuItemClicked.Add(this.navigate)
            resolutionSlider.SizeChanged.Add(this.resizeTemplate)
    
        member this.navigate ea = 
            if ea.Index = 1 then nav.Content <- page1
            elif ea.Index = 2 then nav.Content <- page2
            elif ea.Index = 3 then nav.Content <- page3
    

    它有效...我不知道对内存/性能的影响。我想知道导航fw是否比我做的更有效地处理页面对象的构造/破坏。我认为导航FW与浏览器后退和前进按钮很好地配合 - 我的解决方案没有。


    更新2:看起来好像是C#applciation implments

     public void  InitializeComponent() 
    

    加载和XAML。虽然我不是IL专家;我将在F#侧进行类似的更改......我想知道它是否是部分类概念。我正在研究的一个理论是:

    page.xaml.cs绝对是一个部分类 - 您可以在源代码中阅读它。

    page.xaml有一个引用回c#类的属性。我想知道特殊构建命令是否将其视为一个部分类 - 通过解析它并创建1)任何成员组件引用2)intialComponent()方法,它将页面注册到需要注册的位置?


    更新1:经过一夜的睡眠后,问题可以更准确地说明,因为我有100%的f#/ silverlight实现,并且我希望使用内置的导航组件。 C#创建page.xaml和page.xaml.cs um - ok;但基层的关系是什么?我将如何在f#中执行此操作?

    应用程序加载到默认模块中,我将XAML拉入并从应用程序对象引用它。我是否需要在应用程序对象中创建页面的实例/引用?或者使用正确的名称值对设置其他页面管理对象?

    当VS的所有帮助被剥夺时 - 我们还剩下什么?


    原帖(对于那些可能正在阅读回复的人)

    我有一个100%silverlight 3.0 / f#2.0应用程序我正在缠绕我的大脑。我正确加载了基本应用程序 - 现在我想向其中添加naigation控件。

    我的页面存储为嵌入式资源 - 但Frame.Navigate采用URI。我知道我有什么不对,但现在是:

    let nav : Frame = mainGrid ?  mainFrame
    let url = "/page1.xaml"
    let uri = new System.Uri(url, System.UriKind.Relative) ;
    nav.Navigate uri
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试使用BuildAction Content而不是EmbeddedResource在项目中创建Xaml文件?老实说,我不知道这是否有效,但它可能会以这种方式打包到.xap中,然后相对的uri可能会起作用。它如何在C#项目中运行?试试吧。

修改

啊哈,德米特里的template似乎有这个想法。他拥有BuildAction Resource的Xaml文件,然后是

代码
type MainPage() as this =
    inherit UserControl()
    do
        Application.LoadComponent(this, 
            new System.Uri("/SilverlightApplication3;component/Page.xaml", 
                           System.UriKind.Relative))
    let layoutRoot : Grid = downcast this.FindName("LayoutRoot")

    do 
        ()

加载它。