你如何从端口Silverlight的一个主题WPF的?(How do you port a them

2019-08-31 13:54发布

这很简单”!

我只是碰上了由鲁迪Grobler这个博客帖子 ,说这是“容易”端口从Silverlight来WPF主题。 不幸的是,他并没有说如何做到这一点。


下载并安装

我已经安装了两个WPF工具包和Silverlight工具包从Codeplex上。

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


UT哦,破引用

很多蓝色波浪线。

替代文字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,版本= 2.0.5.0,文化=中性公钥= 7cec85d7bea7798e’,因为它没有被预装。 当使用ReflectionOnly的API,依赖程序集必须是预加载或装载在通过ReflectionOnlyAssemblyResolve事件需求“。 NmtConcept


而且,所以我问...

我如何在WPF Silverlight的主题工作?


更新!

嗯,我想我想通了。 我决定开始与DataGrid 。 我想通了,什么都WPF当量为Silverlight的组件,实际上我得到了我的项目编译和运行。 然后,我看到的结果...

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

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

下面是对的例子Silverlight工具包的网页 。

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

所以,我甚至没有接近。


我做了什么

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


DataGrid的冷冻格

首先,我必须抓住DataGridFrozenGrid从这个Silverlight工具包源代码页 ,因为WPF从来没有听说过这样一类的。


BureauBlue

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

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

  1. 在文件开头的所有刷资源加
  2. Style对于每个控件:

    • DataGridColumnHeader
    • DataGridCell
    • DataGridRowHeader
    • DataGridRow

奇怪的是,原来的文件不包含任何样式的DataGrid本身(请纠正我,如果我错了,但我用查找和一切)。


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 。 或许,这也是一个不错的主意,但同样,编译器让我。


这是否帮助你帮助我吗?

如果你在我身边毕竟还是认为,有什么建议吗?

Answer 1:

我基本上来到了,我是试图将方钉成圆形孔的结论(尽管声称它的“易”)。 Silverlight的DataGrid是从WPF工具包太不同DataGrid 。 因此,就目前而言,我只是在试图样式默认的数据网格的样子BureauBlue。 这是相当艰苦的工作和完善远,但它是在移植的风格一定的改善。

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



Answer 2:

我猜想,未解决的引用是对System.Windows.dll中的Silverlight的版本。 你将不得不更改主题项目引用指向DLL中的WPF版本。

您还可以看看WPF主题项目(由鲁迪Grobler协调),已经有BureauBlue。



文章来源: How do you port a theme from Silverlight to WPF?