2009-03-11 20 views
29

Gần đây tôi đã bắt đầu làm việc với Silverlight và ngay lập tức nhận thấy sự khác biệt giữa Silverlight BCL và đầy đủ .Net và WPF. Đối với một số người trong số họ, tôi đã tìm thấy các giải pháp tuyệt vời được đăng trực tuyến bởi các nhà phát triển khác và những người khác phức tạp hơn. Các tính năng/lớp học nào khiến bạn ngạc nhiên/thất vọng khi thấy vắng mặt trong các thư viện lớp Silverlight, và bạn đã làm gì để giải quyết chúng?Tính năng .Net/WPF nào bạn bỏ lỡ khi làm việc trong Silverlight?

Một số của tôi là:

  1. Không có sự kiện kích hoạt hình ảnh động - Tôi tạo ra một lớp helper với các phương pháp tĩnh để gắn từng loại hoạt hình tôi đã sử dụng để cốt truyện trong một thư viện chia sẻ, đồng cấp ứng dụng tôi tạo các lớp với các phương thức tĩnh để đặt tất cả chúng lại với nhau như tôi sẽ có trong XAML nếu làm việc trong WPF. Cho đến nay, đây là một giải pháp tốt để giữ cho hoạt ảnh của tôi được tổ chức và logic ra khỏi trình xử lý sự kiện của tôi.
  2. ScrollViewer không hỗ trợ bánh xe chuột - Adam Cooper đã tạo một thư viện lớp tuyệt vời bổ sung chức năng này yêu cầu mã tối thiểu để triển khai trong bất kỳ dự án Silverlight nào. Trang web của anh ấy dường như đang ở thời điểm hiện tại, do đó, đây là liên kết tới blog của Tim Heuer giải thích và liên kết tới blog đó (vì vậy nó sẽ khả dụng khi trang web của anh ấy trực tuyến trở lại). Add mouse wheel support to ScrollViewer in Silverlight
  3. SortedDictionary<T, K> bị thiếu. Tôi tìm thấy this post có chứa triển khai, nhưng tôi không tự mình sử dụng nó.
  4. ResourceDictionary.MergedDictionaries không có sẵn - Một lần nữa ... tìm thấy ai đó đã triển khai mã này và đăng mã nguồn, nhưng có vẻ hơi phức tạp. Tôi có lẽ sẽ làm việc thông qua nó một chút, nhưng vẫn chưa làm như vậy. MergedDictionaries in Silverlight
  5. Thuộc tính được đính kèm ZIndex chỉ khả dụng trên đối tượng Canvas. Tôi đã đăng câu hỏi này ở đây trên SO và một người nào đó đã đưa ra đề xuất tuyệt vời để gói các vật chứa của tôi trong bộ sưu tập nếu đó là những gì cần. Nó cảm thấy một chút cẩu thả, nhưng bạn phải làm những gì bạn phải làm. Các vùng chứa của tôi được lồng sâu ba cấp độ, vì vậy tôi có thể cần phải làm cong tất cả chúng trong các đối tượng Canvas và đặt Canvas.ZIndex ba lần cho mỗi sự kiện. Xấu xí như tội lỗi, nhưng nếu đó là cách duy nhất, thì cũng vậy.

Tôi quan tâm để xem những vấn đề phổ biến nào khác mà các nhà phát triển Silverlight có kinh nghiệm đã gặp phải và những gì bạn đã làm để khắc phục chúng.

+0

Bạn có thể loại bỏ (4) bây giờ, khi nó được thêm vào –

+1

Bạn cũng có thể loại bỏ 2, như Silverlight 4 có nguồn gốc hỗ trợ mousewheel cho: TextBox, ComboBox, Lịch, DatePicker và ScrollViewer (vì vậy DataGrid và ListBox là tốt). Và bạn hoàn toàn chắc chắn về 5) ZIndex? Bạn chắc chắn có thể sử dụng nó trong một khung lưới đánh máy Canvas.ZIndex = 123. – texmex5

+2

Có lẽ chúng ta nên thêm vào mỗi câu trả lời cho phiên bản Silverlight đang được giới thiệu. Chủ đề này rất có giá trị nhưng sẽ mất giá trị nhanh chóng theo thời gian nếu người đọc không thể xem các phiên bản đang được thảo luận. –

Trả lời

35

Tôi bắt đầu từ đâu? :)

  • Không MultiBinding
  • Không ElementName = ràng buộc
  • TemplateBinding chỉ có thể tham khảo để tính trực tiếp, không kèm theo DP của
  • Không RelativeSource ràng buộc
  • Không gắn với các thuộc tính con - ví dụ , {Binding Path=Foo.Bar[0].Baz}
  • Không Khả năng đăng ký để sự kiện thay đổi trên bất kỳ tài sản phụ thuộc tùy ý - tác giả lớp có để xác định một cách rõ ràng một sự kiện (và trong hầu hết các trường hợp, chỉ có một hoặc hai thuộc tính trong điều khiển SL thực sự làm)
  • Các trực quan Nhà nước quản lý đòi hỏi tác giả kiểm soát để biết tất cả các nước phong cách thể khi kiểm soát được viết, mà hoàn toàn phá vỡ "mở rộng thông qua phong cách/mẫu, không thừa kế" câu chuyện mà WPF thúc đẩy
  • không Adorners
  • không Navigation
  • Không có tài sản thừa kế phụ thuộc
  • Không/sucky hỗ trợ cho bên ngoài ResourceDictionaries/từ điển sáp nhập
  • Validation câu chuyện hút (nó chỉ nhỉnh hơn trong WPF)
  • In ấn
  • <Setter .. Value="{Binding ...}" /> không được hỗ trợ

Trên hết, một số chữ ký phương thức đã thay đổi không có lý do chính đáng. Ví dụ, IIRC, quá tải cho Dispatcher.Invoke là khác nhau, thay vì SL chỉ bỏ qua các tham số mà nó chưa thể xử lý. Hoặc như một ví dụ khác, ObservableCollection trong WPF có thể tăng thêm, loại bỏ, thay thế và di chuyển các sự kiện - trong SL nó chỉ là ba đầu tiên.

Vì tôi viết mã để hoạt động trên cả hai nền tảng, mã kết thúc lên được rải rác trong các mẫu chiến lược và #ifdefs. Cảm thấy như C++ trên một lần nữa :-)

+0

Tuyệt vời ... Tôi đã hy vọng sẽ có được một danh sách như thế này, vì vậy tôi sẽ không lãng phí giờ nghĩ rằng tôi đã làm điều gì đó sai trái khi nó chỉ đơn giản là không được hỗ trợ. Tôi đã không nhận ra rằng RelativeSource không được hỗ trợ, và tôi đang cố gắng tìm ra những gì tôi đã làm sai. – Rich

+5

Chỉ để ghi lại, khoảng 1/3 trong số này đã được giải quyết trong SL3. –

0

Khiếu nại lớn nhất mà tôi có là thiếu sự hỗ trợ đầy đủ cho tất cả các ràng buộc WCF có sẵn. Chỉ có thể sử dụng BasicHttpBinding rất thường có nghĩa là một giải pháp Silverlight cho một vấn đề không phải là một sự lựa chọn hợp lệ.

2

Không hỗ trợ socket hoặc UDP có lẽ là nỗi đau lớn nhất đối với tôi, theo sau là các lớp mật mã bị thiếu.

Ngoài việc thiếu phân loại như StringDictionary và ApplicationException mà bạn quen với và sau đó tìm thấy không xung quanh là một nỗi đau. Nói chung nó có thể tìm thấy một thay thế hoặc workaround nhưng cá nhân tôi muốn tải Silverlight đi từ 5MB đến 6MB vì ​​vậy chúng tôi đã không phải ;-).

Một mẹo thực sự tiện dụng mà tôi đã thấy trên blog cho phép tôi sử dụng lại các hội đồng .Net bình thường của tôi là thêm các mục hiện có làm liên kết. Trong một số trường hợp bây giờ tôi có hai tệp dự án sử dụng cùng một tệp lớp với một nhắm mục tiêu .Net 3.5 và tệp thời gian chạy Silverlight kia. Tôi vô cùng biết ơn vì tôi đã tìm thấy mẹo đó khi tôi bắt đầu đi xuống con đường tạo các cơ sở mã khác nhau cho .Net 3.5 và Silverlight!

0

Không hỗ trợ 3D.

2

Là một nhà thiết kế, việc thiếu kích hoạt Sự kiện/thuộc tính là vì vậy, không nên xóa.

Tôi không có anh chàng C#/oop nên khi tôi phải kích hoạt một chuỗi các storyboards khi tải mục hoặc một nút được nhấp hoặc sau khi kết thúc một kịch bản, tôi phải gọi các nhà phát triển trong :(

2

Nhưng tôi muốn thứ hai cuộc gọi của anh ấy cho Event/Property triggers ... Khung công tác Triggers trong WPF cho phép tôi thực hiện những điều thực sự mạnh mẽ như một nhà thiết kế tương tác mà không cần phải nhảy vào mã Tôi nhớ nó.

2

Dưới đây là một số điều mà tôi gặp khi tôi chuyển đổi một ứng dụng WPF để Silverlight:

  1. Enum lớp là khác nhau ... Không thể làm điều này trong Silverlight (có thể trong WPF) để ràng buộc vào một Enum:

    HoleType1.ItemsSource = Enum.GetValues ​​(typeof (Hole.HoleTypes));

  2. Cọ màu sắc làm việc khác ...

WPF:

protected Brush _CurrentHoleColor = Brushes.Red; 

Silverlight:

protected Brush _CurrentHoleColor = new SolidColorBrush(Colors.Red); 

3. Đã không làm việc này ra được nêu ra, nhưng một cái gì đó là khác nhau về mã WPF này mà tôi đã sử dụng để kiểm tra nơi con chuột được nhấp:

System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p); 

4. Tôi nghĩ rằng có điều gì đó hơi khác nhau về quá tải sử dụng để tạo chủ đề mới với

this.Dispatcher.BeginInvoke(....) 
0

phong cách bất biến và thiếu từ điển sáp nhập cũng là một lớn một của Silverlight - nếu bạn đang viết điều khiển, hai cung cấp cho bạn rất nhiều rắc rối - không phải đề cập đến các tệp generic.xaml lớn không thể quản lý được.

3

Ngoài danh sách tuyệt vời Paul Stovell 's:

  • Không mở rộng đánh dấu tùy chỉnh.
  • Không x:Type tiện ích mở rộng đánh dấu.
  • Không LayoutTransform (mặc dù có workarounds).
  • Không có siêu dữ liệu thuận tiện cho DependencyProperties (phải tự định nghĩa đo/sắp xếp/hiển thị không hợp lệ, thay đổi thuộc tính, v.v ...).
  • Không có trọng lượng nhẹ Drawing hoặc DrawingContext lớp học (phải sử dụng Shape yếu tố).
  • Không có lệnh nào.
+0

yep ... chỉ cần đi qua một nhu cầu cho một phần mở rộng đánh dấu tùy chỉnh, và nhận ra nó không thể được thực hiện. = / – Rich

0

Phối cảnh 3d rất tuyệt, nhưng tôi không thể đợi 3D thực!

0
  • ScrollViewer không có sự kiện thay đổi (bạn phải sử dụng một hack ràng buộc)
  • Không có trình duyệt-agnostic menu ngữ cảnh hỗ trợ cho đến khi phiên bản 4
  • TNHH DocumentFlow hỗ trợ
  • Không hỗ trợ MD5 (nhưng hiện đại hơn các thuật toán băm thay thế)
  • WebClient không cho phép bạn thực hiện các yêu cầu được xác thực HTTP.

peeve lớn nhất của tôi:

  • tổ của một con chuột của namespace
Các vấn đề liên quan