обновление 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:
шаблон, упомянутый Брайаном, в основном делает свое дело.У меня все еще есть более сложная страница, которая доставляет мне проблемы, но, скорее всего, это мой код.Как только мой код будет завершен, я опубликую то, что я могу диагностировать, но части включают в себя:
- Правильная настройка App.XAML (правильная ссылка на объект вашего приложения)
- в пост-конструкции вашего приложение объект использует Application.Load для загрузки App.xaml
- В вашем приложении объект создает экземпляры вашей страницы xaml
- при постостроении ваших страниц объектов используйте Application.Load для загрузки отдельной страницы. xaml
- каждый из ваших страниц объектов должен расширять UserControl;Я подозреваю, что это не совсем так - как только я получу более сложную страницу, я посмотрю, будет ли снятие этого ограничения иметь эффект.
обновление 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 со строительством / уничтожением объектов page более эффективно, чем то, что я сделал.Я думаю, что навигационная FW прекрасно работает с кнопками браузера «назад» и «вперед», чего нет в моем решении.
обновление 2: похоже, что C # applciation имеет значение
public void InitializeComponent()
, который загружает и XAML.Хотя я не эксперт по IL;Я сделаю аналогичные изменения на стороне F # ... Интересно, если это концепция частичный класс .Одна теория, над которой я работаю, такова:
page.xaml.cs определенно является частичным классом - вы можете прочитать его в источнике.
page.xaml имеет атрибут, который ссылается нас # класс.Интересно, обрабатывают ли специальные команды сборки это как частичный класс - анализируя его и создавая 1) любые ссылки на компоненты-члены 2) метод intialComponent (), который регистрирует страницу, где бы она ни была зарегистрирована?
Обновление 1: после ночного сна проблема может быть сформулирована более точно, поскольку у меня есть 100% -ная реализация f # / silverlight и я собираюсь использовать встроенные компоненты навигации.C # создает page.xaml и page.xaml.cs ум - хорошо;но каковы отношения на фундаментальном уровне?Как мне поступить так в f #?
Приложение загружено в модуль по умолчанию, и я извлекаю XAML и ссылаюсь на него из объекта приложения.Нужно ли создавать экземпляры / ссылки на страницы внутри объекта приложения?Или настроить какой-либо другой объект управления страницей с правильными парами значений имени?
Когда все Справка VS удалены - что у нас осталось?
оригинальный пост (для тех, кто может читать ответы)
У меня есть приложение 100% silverlight 3.0 / f # 2.0, которое я оборачиваю.У меня правильно загружается базовое приложение - и теперь я хочу добавить к нему элементы управления навигацией.
Моя страница хранится как встроенный ресурс, но Frame.Navigate принимает URI.Я знаю, что у меня не так, но вот оно:
let nav : Frame = mainGrid ? mainFrame
let url = "/page1.xaml"
let uri = new System.Uri(url, System.UriKind.Relative) ;
nav.Navigate uri
Есть мысли?