这简单”!
我刚刚看到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 事件预加载或按需加载依赖程序集。Nmt概念
而且,所以我问...
如何使 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 源代码页中获取,因为 WPF 从未听说过这样的类。
蓝局
然后我粘贴了BureauBlue 源代码中的关键部分(再次警告:这个宝贝加载速度很慢)。
通过关键部分,我的意思是:
- 文件开头的所有画笔资源加
对于
Style
这些控件中的每一个:- 数据网格列标题
- 数据网格单元
- DataGridRowHeader
- 数据网格行
奇怪的是,原始文件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">
更改这些名称似乎是一个非常糟糕的主意 - 并且可能是我所有问题的原因 - 但我不知道还要做什么才能编译。
我必须做的另一个改变是:一开始的一些SolidColorBrush
andLinearGradientBrush
项目使用了x:Name
而不是x:Key
. 我将它们全部更改为x:Key
. 也许这也是一个坏主意,但是编译器又让我做了。
这对你有帮助吗?
如果你仍然和我在一起,有什么建议吗?