2012-09-12 11 views
6

Tôi đang viết mã được sử dụng trong cả WPF và Silverlight. Trong C# tôi có thể sử dụng "#if SILVERLIGHT" để biên dịch có điều kiện và nó hoạt động.XAML hợp nhất cho WPF và Silverlight sử dụng T4?

Trong XAML, tuy nhiên, tôi phải sử dụng các tệp XAML hoàn toàn khác nhau vì một số thuộc tính đơn giản là không tương thích. Các tệp XAML là 99%, và việc giữ chúng đồng bộ là một rắc rối.

Tôi muốn chuyển đổi chúng thành một mẫu T4, vì vậy tôi có thể làm những việc như:

<SomeControl <#=ClipsToBounds()#> /> 

đâu ClipsToBounds() sản xuất văn bản khác cho WPF và Silverlight. Các yêu cầu là:

  • Intellisense trong khi làm việc trên các vecto XAML
  • tạo ra tại thời gian xây dựng
  • Dự án phải được khép kín và làm việc trên phiên bản cổ của Visual Studio: cài đặt SDK khác nhau và các biên tập viên bên thứ 3 không phải là chấp nhận được
  • Kết quả chạy mẫu không được trong điều khiển nguồn. -

Tôi thấy rằng tôi có thể thay đổi custom tool trên tệp XAML từ MSBuild:Compile to TextTemplatingFileGenerator và tôi không mất Intellisense. Tuy nhiên, các mẫu kết quả được tạo ra vào lúc thiết kế. Để có được sau đó tạo ra tại thời gian xây dựng có vẻ như một nỗi đau lớn.

Có ai có kinh nghiệm thành công với loại thiết lập này không?

+0

Bạn không sử dụng thư viện lớp di động? –

+0

Các thư viện lớp di động giải quyết được vấn đề về mã không phải UI được chia sẻ, chúng phải phù hợp với lớp ViewModel nếu sử dụng MVVM chứ không phải dạng xem. –

Trả lời

0

Chỉ các điều khiển người dùng chung có hành vi chung trên nền tảng mới có thể được đặt trong PCL, Tuy nhiên, đề xuất tốt nhất sẽ giữ các chế độ xem xaml riêng biệt cho từng nền tảng.

0

Vì dường như không ai đề xuất giải pháp dựa trên mẫu như mong muốn, tôi sẽ chia sẻ một số kinh nghiệm làm việc với các dự án nhắm mục tiêu cả SL/WPF. Nhiều người sẽ đề xuất sử dụng hai tệp XAML hoàn toàn riêng biệt, một chế độ xem khác nhau trên mỗi nền tảng và theo nhiều cách, đây là điều "thuần khiết" cần làm. Nhưng nếu bạn muốn loại bỏ trùng lặp, và giảm nguy cơ 2 mục tiêu của bạn trôi xa nhau, tôi chắc chắn đề nghị chia sẻ các tệp XAML (với các liên kết dự án đơn giản) có thể hoạt động tốt.

Có một vài sự không tương thích chung:

  • Controls tồn tại trong cả hai nền tảng trong không gian tên khác nhau - phân lớp phiên bản riêng của bạn và tham khảo đó.
  • Kiểu v.v. cần khác nhau giữa các nền tảng - bao gồm từ điển chung về tài nguyên, mỗi nền tảng khác nhau và tham chiếu theo khóa.
  • Điều khiển khác nhau đáng kể, hoặc chỉ có trong 1 nền tảng - giới thiệu kiểm soát trình bao bọc của riêng bạn (có thể yêu cầu triển khai thực hiện đáng kể trong trường hợp 'thiếu').
  • Tính chất cơ bản hoặc thiếu functonality - thường có thể hack một thứ gì đó với hành vi đính kèm (ví dụ: ví dụ ClipsToBounds của bạn được tìm thấy here).