7

这简单”!

我刚刚看到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 源代码中的关键部分(再次警告:这个宝贝加载速度很慢)。

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

  1. 文件开头的所有画笔资源加
  2. 对于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">

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

我必须做的另一个改变是:一开始的一些SolidColorBrushandLinearGradientBrush项目使用了x:Name而不是x:Key. 我将它们全部更改为x:Key. 也许这也是一个坏主意,但是编译器又让我做了。


这对你有帮助吗?

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

4

2 回答 2

2

I basically came to the conclusion that I was trying to fit a square peg into a round hole (despite claims that it's "easy"). The Silverlight DataGrid is just too different from the WPF Toolkit DataGrid. So, for the moment, I've just been trying to style the default data grid to look like BureauBlue. It's quite painstaking work and far from perfect, but it's a definite improvement over the ported style.

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

于 2009-10-23T22:05:11.923 回答
1

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

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

于 2009-10-23T02:36:53.420 回答