[英]Silverlight ControlTemplate and F#
是否有人成功將Silverlight ControlTemplate集成到F#Silverlight應用程序中。 我正在嘗試將過渡添加到Navgiation.Frame元素,然后再添加一個C#示例: http ://www.davidpoll.com/2009/07/19/silverlight-3-navigation-adding-transitions-to-the -框架控制
下載的源代碼使用模板XAML上的MSBUILD:Compile選項,並且該文件作為“頁面”包含在內。ILDASM不顯示為XAML創建的任何對象;它只顯示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)
在應用啟動的某個位置:
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>
關於這個問題的任何建議或想法都值得贊賞。
根據brians的評論,我調查了MSBUILD命令診斷程序,除了將其包括為資源之外,它似乎沒有做任何其他事情:
生成.resources文件:'obj \\ Debug \\ TransitioningNavigation.g.resources'...(TaskId:14)讀取資源文件:'C:\\ Users \\ todd.brown \\ Desktop \\ TransitioningNavigation \\ TransitioningNavigation \\ Assets \\ Styles.xaml' ...(TaskId:14)資源ID為'assets / styles.xaml'。 (TaskId:14)
讀取資源文件:'C:\\ Users \\ todd.brown \\ Desktop \\ TransitioningNavigation \\ TransitioningNavigation \\ Assets \\ TransitioningFrame.xaml'...(TaskId:14)資源ID為'assets / transitioningframe.xaml'。 (TaskId:14)
好一件有趣的事情是,如果我將對App.xaml的ContentTemplate xaml索引的引用重命名,則該應用程序將不會加載並引發錯誤-因此我猜該頁面已被正確引用和加載。 即這很糟糕
<ResourceDictionary Source="/FSSilverlightApp;component/TransitioningFrameBAD.xaml"/>
轉到命令行並運行可能會很有用
msbuild /t:clean
msbuild /v:diag > diagnostics.txt
並檢查診斷日志以找出“該Xaml文件(使用ResourceDictionary
)在后台進行的Compile
”。 這可能暗示了對F#做什么。
好吧,我實際上是在WPF 4.0中編寫ControlTemplates的,所以這對於Silverlight來說也應該很有效,請查看以下文章和我提到的git-hub源代碼,
http://fadsworld.wordpress.com/2011/03/05/f-wpf-component-development/
您應該對如何聲明資源,將其與控件模板一起使用以及將控件模板加載到自定義控件中的想法有所了解。 我也讓BLEND以這種方式工作。
讓我知道您是否需要任何幫助。
謝謝,法哈德
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.