Silverlight ControlTemplate和F#

时间:2010-05-24 19:27:53

标签: silverlight silverlight-3.0 f#

是否有人成功将Silverlight ControlTemplate整合到F#Silverlight应用程序中。我正在尝试向Navgiation.Frame元素添加转换,然后继续使用C#示例:http://www.davidpoll.com/2009/07/19/silverlight-3-navigation-adding-transitions-to-the-frame-control

下载的源使用模板XAML上的MSBUILD:Compile选项,该文件作为“页面”包含在内...... ILDASM不显示为XAML创建的任何对象;

在我的项目中,我把它作为“资源”(与我为我的页面所做的相同)并在app.xaml中引用它:

<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>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/FSSilverlightApp;component/TransitioningFrame.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

TransitioningFrame.xaml如下:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit">
    <ControlTemplate x:Key="TransitioningFrame" TargetType="navigation:Frame">
        <Border Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
            <toolkit:TransitioningContentControl Content="{TemplateBinding Content}"
                                                 Cursor="{TemplateBinding Cursor}"
                                                 Margin="{TemplateBinding Padding}"
                                                 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                 HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                 VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                                                 Transition="DefaultTransition" />
        </Border>
    </ControlTemplate>
</ResourceDictionary>

我的页面对象都使用以下代码加载各自的xaml:

type Page1() as this =
    inherit UriUserControl("/FSSilverlightApp;component/Page1.xaml")
    do
        Application.LoadComponent(this, base.uri)

在app启动的某个地方:

let p1 = new Page1()

我没有为ControlTemplate提供类似的作品 - 虽然我希望应用程序对象和App.xaml能够将它真正地拉入 (顺便说一下,对这种魔法的依赖已经使得设置100%f#silverlight应用程序相当棘手 - 因为我发现几乎所有发表的文章都是基于向导和捷径 - 对于管道管道来说很少 - 呃)。

页面xaml通过以下方式引用控件:

<StackPanel Grid.Row="3" Grid.Column="2" Name="mainPanel">
     <navigation:Frame Name="contentFrame" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Template="{StaticResource TransitioningFrame}"/>
</StackPanel>

对此主题的任何建议或想法表示赞赏。


Per brians发表评论,我研究了MSBUILD命令诊断,除了将它作为资源包含之外,它看起来并不像以前那样:

  

生成.resources文件:   'OBJ \调试\ TransitioningNavigation.g.resources' ...   (TaskId:14)读取资源文件:   'C:\用户\ todd.brown \桌面\ TransitioningNavigation \ TransitioningNavigation \资产\ Styles.xaml' ...   (TaskId:14)资源ID是   资产/ styles.xaml“。 (TASKID:14)
  阅读资源文件:   'C:\用户\ todd.brown \桌面\ TransitioningNavigation \ TransitioningNavigation \资产\ TransitioningFrame.xaml' ...   (TaskId:14)资源ID是   资产/ transitioningframe.xaml“。   (TASKID:14)


一个有趣的事情是,如果我在App.xaml的内部重命名ContentTemplate xaml的引用 - 应用程序deos not load并抛出错误 - 所以我猜这个页面正在被引用和正确加载。即这很糟糕

<ResourceDictionary Source="/FSSilverlightApp;component/TransitioningFrameBAD.xaml"/>

2 个答案:

答案 0 :(得分:0)

转到命令行并运行

可能很有用
msbuild /t:clean
msbuild /v:diag > diagnostics.txt

并检查诊断日志,找出'Xaml文件的CompileResourceDictionary)在幕后做什么'。这可能暗示了如何为F#做些什么。

答案 1 :(得分:0)

好吧,我实际上是在WPF 4.0中编写了ControlTemplates,所以这对Silverlight也很有用,请查看下面的帖子和我提到的git-hub源代码,

http://fadsworld.wordpress.com/2011/03/05/f-wpf-component-development/

您应该了解如何声明资源,将它们与控件模板一起使用以及在自定义控件中加载控件模板。我也让BLEND以这种方式工作。

如果您需要任何帮助,请告诉我。

谢谢, 法赫德