更新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提到的模板主要是诀窍。我仍然有一个更复杂的页面给我带来麻烦 - 但它很可能是我的代码。一旦我的代码完成,我将发布我可以诊断的内容但部分包括:更新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
有什么想法吗?
答案 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
()
加载它。