Slverlight Navigate: как это работает? Как бы вы реализовали в F # W / O VS мастеров и помощников? - PullRequest
0 голосов
/ 20 мая 2010

обновление 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:

шаблон, упомянутый Брайаном, в основном делает свое дело.У меня все еще есть более сложная страница, которая доставляет мне проблемы, но, скорее всего, это мой код.Как только мой код будет завершен, я опубликую то, что я могу диагностировать, но части включают в себя:

  1. Правильная настройка App.XAML (правильная ссылка на объект вашего приложения)
  2. в пост-конструкции вашего приложение объект использует Application.Load для загрузки App.xaml
  3. В вашем приложении объект создает экземпляры вашей страницы xaml
  4. при постостроении ваших страниц объектов используйте Application.Load для загрузки отдельной страницы. xaml
  5. каждый из ваших страниц объектов должен расширять 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

Есть мысли?

1 Ответ

0 голосов
/ 20 мая 2010

Вы пытались сделать Xaml файлом в проекте с BuildAction из Content вместо EmbeddedResource? Честно говоря, я понятия не имею, если это работает, но это может быть упаковано в .xap таким образом, и тогда может сработать относительное URI. Как это будет работать в проекте C #? Попробуй это.

EDIT

Ага, шаблон Дмитрия , похоже, это выяснил. У него есть файлы Xaml с BuildAction из Resource, а затем код, подобный

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

чтобы загрузить его.

...