2009-10-23 26 views
7

Thật dễ dàng!Làm cách nào để chuyển một chủ đề từ Silverlight sang WPF?

Tôi vừa xem qua số this blog post by Rudi Grobler cho biết việc chuyển một chủ đề từ Silverlight sang WPF thật dễ dàng. Thật không may, anh ấy không nói làm thế nào để làm điều đó.


Tải về và cài đặt

Tôi đã cài đặt cả WPF ToolkitSilverlight Toolkit từ CodePlex.

Tôi cũng đã đi và đào lên the source code for the theme I'm interested in (BureauBlue) (cảnh báo, quá trình này mất chút thời gian để tải) và dán vào tệp Tài nguyên từ điển mới trong dự án thử nghiệm của tôi.


Út oh, tài liệu tham khảo gãy

Rất nhiều dòng màu xanh nguệch ngoạc.

alt text http://img32.imageshack.us/img32/6032/brokenreferences.jpg


Không tài liệu tham khảo ở đây

Vì vậy, tôi đã đi để thêm tài liệu tham khảo và khám phá ra ... họ không được liệt kê.

alt text http://img35.imageshack.us/img35/7466/addreferencedialog.jpg


Ahh, có họ là

May mắn thay, tôi đã có thể tìm thấy chúng sau khi một số mở rộng duyệt.

alt text http://img269.imageshack.us/img269/3830/addreferencedialogbrows.jpg


Và như vậy chúng tôi được gửi

Sau khi tìm thấy các tài liệu tham khảo còn thiếu, tôi đã cố gắng để thêm chúng. Điều này thực sự dường như để giải quyết chia xmlns liên kết (ít nhất là các dòng nguệch ngoạc màu xanh ra đi), nhưng khi tôi đã xây dựng dự án của tôi, tôi đã nhận ra lỗi:

Error 1 Unknown build error, 'Cannot resolve dependency to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' because it has not been preloaded. When using the ReflectionOnly APIs, dependent assemblies must be pre-loaded or loaded on demand through the ReflectionOnlyAssemblyResolve event.' NmtConcept


Và, vì vậy tôi hỏi ...

Làm cách nào để tạo chủ đề Silverlight hoạt động trong WPF?


Cập nhật!

Vâng, tôi nghĩ tôi đã tìm ra. Tôi quyết định bắt đầu với DataGrid.Tôi đã tìm ra tất cả những gì tương đương với WPF dành cho các hội đồng Silverlight, và tôi thực sự có dự án biên dịch và chạy. Và sau đó tôi thấy kết quả ...

alt text http://img44.imageshack.us/img44/2418/porteddatagrid.jpg

Tiêu đề có phần đúng (trừ các mũi tên loại mất tích), nhưng phần còn lại của nó trông giống như là có một số loại tai nạn khủng khiếp liên quan đến viên gạch màu nâu .

Đây là ví dụ về số Silverlight Toolkit webpage.

alt text http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg

Vì vậy, tôi thậm chí không đến gần.


Những gì tôi đã làm

Xin cho phép tôi giải thích những gì tôi đã làm để đi đến đống lộn xộn này.


DataGridFrozenGrid

Trước tiên, tôi đã phải lấy DataGridFrozenGrid từ this Silverlight Toolkit source code page vì WPF chưa bao giờ nghe nói về một lớp học như vậy.


BureauBlue

Sau đó, tôi dán trong phần quan trọng từ the source code for BureauBlue (một lần nữa, cảnh báo: em bé này là chậm để tải).

By phần quan trọng, ý tôi là:

  1. Tất cả các nguồn lực bàn chải vào đầu của tập tin cộng với
  2. Các Style cho mỗi người trong số các điều khiển:

    • DataGridColumnHeader
    • DataGridCell
    • DataGridRowHeader
    • DataGridRow

Kỳ lạ thay, các tập tin ban đầu không chứa kiểu cho DataGrid bản thân (hãy sửa lại cho tôi nếu tôi sai, nhưng tôi sử dụng Tìm và tất cả mọi thứ).


Silverlight -> WPF

Tiếp theo, tôi chuyển đổi các tài liệu tham khảo xmlns để WPF tương đương.Dưới đây là cách phần tử ResourceDictionary của tôi bật ra:

<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"> 

Tôi tất nhiên đã chỉnh sửa thẻ không gian tên để khớp.


Chỉnh sửa cho đến khi nó hoạt động

Một khi tôi đã có tất cả làm việc này, tôi vẫn có một vài vấn đề nhỏ. Một số phần tử x:Name có khoảng trống trong chúng. Trình biên dịch sẽ không cho phép điều này, vì vậy tôi phải thay thế các dấu cách bằng dấu gạch dưới.

Dưới đây là các đoạn có liên quan:

<!-- 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"> 

Thay đổi các tên này dường như là một ý tưởng rất xấu - và có thể là nguyên nhân của mọi vấn đề của tôi - nhưng tôi không biết làm gì khác để có được thứ để biên dịch.

Sự thay đổi khác mà tôi phải thực hiện là: một số các mục SolidColorBrushLinearGradientBrush ở đầu sử dụng x:Name thay vì x:Key. Tôi đã thay đổi tất cả chúng thành x:Key. Có lẽ đây cũng là một ý tưởng tồi, nhưng một lần nữa, trình biên dịch đã làm tôi.


Điều này có giúp bạn giúp tôi không?

Nếu bạn vẫn ở bên tôi sau tất cả, có đề xuất nào không?

Trả lời

2

Tôi về cơ bản đã đi đến kết luận rằng tôi đã cố gắng để phù hợp với một hình vuông chốt vào một lỗ tròn (mặc dù tuyên bố rằng nó là "dễ dàng"). Silverlight DataGrid quá khác với Bộ công cụ WPF DataGrid. Vì vậy, hiện tại, tôi đã cố gắng tạo kiểu cho lưới dữ liệu mặc định trông giống như BureauBlue. Đó là công việc khá siêng năng và xa hoàn hảo, nhưng đó là một cải tiến rõ ràng so với phong cách được chuyển.

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

1

Tôi đoán rằng tham chiếu chưa được giải quyết là phiên bản Silverlight của System.Windows.dll. Bạn sẽ phải thay đổi các tham chiếu trong dự án chủ đề để trỏ đến phiên bản WPF của các dll.

Bạn cũng có thể xem dự án WPF themes (phối hợp bởi Rudi Grobler), đã có BureauBlue.

+0

Ahh, có ý nghĩa. Tôi thực sự có từ điển tài nguyên cho BureauBlue từ dự án WPF Themes, nhưng nó không chứa các kiểu cho 'DataGrid',' DataPicker' và 'Calendar'. – devuxer

+0

Vâng, tôi đã cho một shot (xem cập nhật cho câu hỏi của tôi), nhưng nó đã không làm việc quá tốt. – devuxer

Các vấn đề liên quan