如何将主题从Silverlight移植到WPF?

时间:2009-10-23 02:33:17

标签: wpf visual-studio silverlight xaml wpftoolkit

这很“轻松”!

我刚刚遇到this blog post by Rudi Grobler,表示将主题从Silverlight移植到WPF很“容易”。不幸的是,他没有说怎么做。


下载并安装

我已经从Codeplex安装了WPF ToolkitSilverlight Toolkit

我也去挖掘the source code for the theme I'm interested in (BureauBlue)(警告,加载需要一些时间),并将其粘贴到我的测试项目中的新资源字典文件中。


哦,破坏的参考文献

很多蓝色波浪线。

alt text http://img32.imageshack.us/img32/6032/brokenreferences.jpg


此处没有参考

所以,我去添加引用并发现......它们没有列出。

alt text http://img35.imageshack.us/img35/7466/addreferencedialog.jpg


啊,他们是

幸运的是,经过广泛的浏览后,我能够找到它们。

alt text http://img269.imageshack.us/img269/3830/addreferencedialogbrows.jpg


所以我添加了

找到缺失的引用后,我尝试添加它们。这实际上似乎解决了破碎的xmlns链接(至少蓝色波浪线消失了),但是当我构建我的项目时出现错误:

  

错误1未知的构建错误,'无法解析对程序集的依赖性'System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e',因为它尚未预加载。使用ReflectionOnly API时,必须通过ReflectionOnlyAssemblyResolve事件按需预加载或加载相关的程序集。 NmtConcept


所以我问......

如何在WPF中使Silverlight主题工作?


更新!

嗯,我以为我弄清楚了。我决定从DataGrid开始。我弄清楚了Silverlight程序集的所有WPF等价物,我实际上已经完成了我的项目编译和运行。然后我看到了结果......

alt text http://img44.imageshack.us/img44/2418/porteddatagrid.jpg

标题有点正确(除了丢失的排序箭头),但其余部分看起来有一种涉及棕褐色砖块的可怕事故。

以下是Silverlight Toolkit webpage上的示例。

alt text http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg

所以,我甚至没有接近。


我做了什么

请允许我解释一下我为达到这个烂摊子所做的工作。


DataGridFrozenGrid

首先,我必须从this Silverlight Toolkit source code page抓取DataGridFrozenGrid,因为WPF从未听说过这样的课程。


BureauBlue

然后我粘贴了来自the source code for BureauBlue关键部分(再次警告:这个宝宝加载速度很慢)。

通过关键部分,我的意思是:

  1. 文件开头的所有画笔资源加上
  2. 每个控件的Style

    • DataGridColumnHeader
    • DataGridCell
    • DataGridRowHeader
    • DataGridRow
  3. 奇怪的是,原始文件中没有DataGrid本身的样式(如果我错了,请纠正我,但我使用了Find和所有内容)。


    Silverlight - > WPF

    接下来,我将xmlns引用转换为WPF等效项。以下是ResourceDictionary元素的结果:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mwc="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
        xmlns:mwcp="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit"
        xmlns:swcp="clr-namespace:System.Windows.Controls.Primitives;assembly=CommonLibraryWpf"
        xmlns:sw="clr-namespace:System.Windows;assembly=WPFToolkit">
    

    我当然编辑了名称空间标签以匹配。


    编辑直到有效

    一旦我完成了所有这些工作,我仍然有一些小问题。一些x:Name元素中包含空格。编译器不允许这样做,所以我不得不用下划线替换空格。

    以下是相关摘录:

    <!-- Important: all underscores used to be spaces -->
    <sw:VisualState
        x:Name="MouseOver_CurrentRow_Selected">
    <sw:VisualState
        x:Name="Normal_CurrentRow">
    <sw:VisualState
        x:Name="Normal_Selected">
    <sw:VisualState
        x:Name="Normal_EditingRow">
    <sw:VisualState
        x:Name="Normal_AlternatingRow" />
    <sw:VisualState
        x:Name="Normal_Selected">
    <sw:VisualState
        x:Name="MouseOver_Selected">
    <sw:VisualState
        x:Name="Unfocused_Selected">
    

    更改这些名称似乎是一个非常糟糕的主意 - 可能是我所有问题的原因 - 但我不知道还有什么可以做的事情来编译。

    我必须做的另一项更改是:开头的一些SolidColorBrushLinearGradientBrush项使用了x:Name而不是x:Key。我把所有这些都改为x:Key。也许这也是一个坏主意,但再次,编译器让我。


    这有助于您帮助我吗?

    如果你仍然和我在一起,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我基本上得出的结论是,我试图将一个方形钉固定在一个圆孔中(尽管声称它“很容易”)。 Silverlight DataGrid与WPF工具包DataGrid太不一样了。所以,目前,我一直在尝试将默认数据网格设置为看起来像BureauBlue。这是非常艰苦的工作,远非完美,但它比移植风格有了明显的改进。

alt text http://img26.imageshack.us/img26/7163/styleddatagrid.jpg

答案 1 :(得分:1)

我猜想未解决的引用是System.Windows.dll的Silverlight版本。您必须更改主题项目中的引用以指向dll的WPF版本。

您还可以查看已经拥有BureauBlue的WPF themes项目(由Rudi Grobler协调)。