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

dev*_*xer 7 silverlight wpf xaml wpftoolkit visual-studio

这很简单"!

我刚刚看到Rudi Grobler的这篇博客文章说,将主题从Silverlight移植到WPF是"容易的".不幸的是,他没有说怎么做.


下载并安装

我已从Codeplex 安装了WPF ToolkitSilverlight Toolkit.

我也去挖掘了我感兴趣的主题的源代码(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等价物,我实际上已经完成了我的项目编译和运行.然后我看到了结果......

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

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

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

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

所以,我甚至没有接近.


我做了什么

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


DataGridFrozenGrid

首先,我必须DataGridFrozenGrid这个Silverlight Toolkit源代码页中获取,因为WPF从未听说过这样的类.


BureauBlue

然后,我将在关键件来自于BureauBlue的源代码(再次警告:这个孩子是加载缓慢).

通过关键件,我的意思是:

  1. 文件开头的所有画笔资源加上
  2. 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">
Run Code Online (Sandbox Code Playgroud)

我当然编辑了命名空间标签以匹配.


编辑直到它工作

一旦我完成了所有这些工作,我仍然有一些小问题.一些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">
Run Code Online (Sandbox Code Playgroud)

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

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


这有助于你帮助我吗?

如果你还是跟我在一起,有什么建议吗?

dev*_*xer 2

我基本上得出的结论是,我正在尝试将方形钉子装入圆孔中(尽管声称这很“容易”)。SilverlightDataGrid与 WPF 工具包有很大不同DataGrid。因此,目前我只是尝试将默认数据网格的样式设置为看起来像 BureauBlue。这是一项相当艰苦的工作,而且远非完美,但相对于移植风格来说,这是一个明确的改进。

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