你如何将Silverlight的主题移植到WPF?

这很容易”!

我刚刚在Rudi Grobler的博客文章中发现,将Silverlight主题移植到WPF是“容易的”。 不幸的是,他没有说如何去做。


下载并安装

我已经安装了Codeplex的WPF工具包和Silverlight工具包。

我还去挖掘了我感兴趣的主题(BureauBlue)的源代码(警告,这需要一点时间来加载),并将其粘贴到我的测试项目中的新资源字典文件中。


哦,破碎的参考文献

许多蓝色的波浪线。

替代文字http://img32.imageshack.us/img32/6032/brokenreferences.jpg


这里没有参考

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

替代文字http://img35.imageshack.us/img35/7466/addreferencedialog.jpg


啊,他们在

幸运的是,我经过一番广泛的浏览后才找到它们。

替代文字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


而且,所以我问...

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


更新!

好吧,我想我明白了。 我决定从DataGrid开始。 我想出了Silverlight程序集的所有WPF等价物,并且我实际上已经让我的项目能够编译并运行。 然后我看到了结果...

替代文字http://img44.imageshack.us/img44/2418/porteddatagrid.jpg

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

以下是Silverlight Toolkit网页上的示例。

替代文字http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg

所以,我甚至都没有接近。


我做了什么

请允许我解释我做了什么来达到这个烂摊子。


DataGridFrozenGrid

首先,我必须从Silverlight Toolkit源代码页中获取DataGridFrozenGrid ,因为WPF从来没有听说过这样的类。


BureauBlue

然后,我粘贴了BureauBlue源代码中的关键部分(同样,警告:这个宝贝加载速度很慢)。

我的意思是:

  • 文件开头的所有画笔资源加上
  • 每种控件的Style

  • DataGridColumnHeader
  • DataGridCell
  • DataGridRowHeader
  • DataGridRow
  • 奇怪的是,原始文件不包含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 。 也许这也是一个不好的主意,但编译器再一次造就了我。


    这有助于你帮助我吗?

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


    我基本上得出的结论是,我试图将一个方形钉固定在圆孔中(尽管声称它很“容易”)。 Silverlight DataGrid与WPF Toolkit DataGrid截然不同。 所以,目前,我刚刚试图将默认数据网格设置为BureauBlue。 这是一项非常艰苦的工作,远非完美,但对于移植的风格来说,这是一个明显的改进。

    替代文字http://img26.imageshack.us/img26/7163/styleddatagrid.jpg


    我猜测未解决的参考是System.Windows.dll的Silverlight版本。 您将不得不更改主题项目中的引用以指向dll的WPF版本。

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

    链接地址: http://www.djcxy.com/p/887.html

    上一篇: How do you port a theme from Silverlight to WPF?

    下一篇: text at the Phonological level?