2009-05-05 9 views
6

Tôi bắt đầu chơi với WPF và muốn vẽ color wheel trên biểu mẫu.Làm thế nào để vẽ bánh xe màu trong ứng dụng WPF?

Lúc đầu, tôi tryed để sử dụng LinearGradientBrush trên ArcSegment như thế này:

<Path StrokeThickness="35" Height="150" Width="150"> 
    <Path.Stroke> 
     <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> 
      <GradientStop Color="Red" Offset="0.15" /> 
      <GradientStop Color="Orange" Offset="0.2" /> 
      <GradientStop Color="Yellow" Offset="0.35" /> 
      <GradientStop Color="Green" Offset="0.5" /> 
      <GradientStop Color="Blue" Offset="0.65" /> 
      <GradientStop Color="Indigo" Offset="0.75" /> 
      <GradientStop Color="Violet" Offset="0.9" /> 
     </LinearGradientBrush> 
    </Path.Stroke> 
    <Path.Data> 
     <PathGeometry > 
      <PathFigure IsClosed="True" StartPoint="25,70"> 
       <ArcSegment Point="25,71" IsLargeArc="True" 
        Size="50,50" SweepDirection="Clockwise" /> 
      </PathFigure> 
     </PathGeometry> 
    </Path.Data> 
</Path> 

không thành công, bởi vì độ dốc vẫn ngang.

Một ý tưởng khác là những gì tôi phải uốn cong bằng cách nào đó sau khi áp dụng gradient. Nhưng tôi không thể tìm thấy sự biến đổi thích hợp.

Nếu không có biến đổi tiêu chuẩn nào thì có thể thực hiện chuyển đổi tùy chỉnh? Hay tôi nên vẽ bánh xe màu bằng pixel?

Bất kỳ ý tưởng nào, vui lòng.

Trả lời

1

This library has pixel shaders that draw color wheels

mẫu XAML:

<Ellipse Width="300" 
     Height="300" 
     Fill="White"> 
    <Ellipse.Effect> 
     <effects:HsvWheelEffect /> 
    </Ellipse.Effect> 
</Ellipse> 

Lưu ý rằng các hình elip phải có một bàn chải đặt trên Fill để làm việc này, có thể là bất kỳ màu nào.

2

Điều bạn đang tìm kiếm là Path Gradient Brush. Đáng buồn thay, nó chưa có sẵn trong WPF (nhưng nó là trong GDI +). Có lẽ trong một phiên bản tương lai ...

Tôi có ý tưởng về cách lấy bánh xe màu gần đúng.

Mô tả cấp cao của nó sẽ sử dụng các đường thẳng (hình chữ nhật) được xoay và dịch để tạo một đa giác thông thường có độ dày rộng hơn chiều rộng vòng mong muốn. Sau đó, bạn "cắt bỏ" một hình tròn và sử dụng nó làm bánh xe màu của bạn.

Bánh xe màu có nhiều màu chính (đỏ, lục, lam, vàng, v.v ...). Trước tiên, bạn cần phải xác định phép đo mức độ từ một số đường cơ sở tùy ý. Ví dụ, màu đỏ là 0 radian, màu xanh dương là pi radian, vv Bạn cũng xác định bán kính bên trong và bên ngoài cho vòng. Sử dụng trig, bạn đi bộ xung quanh hình chữ nhật vẽ vòng với một gradient tuyến tính từ màu sắc bạn bắt đầu vào màu liền kề tiếp theo. Chiều rộng của hình chữ nhật sẽ phải lớn hơn chiều rộng của vòng tròn (bạn sẽ thấy lý do sau này) và hình chữ nhật sẽ cần phải được xoay để tiếp xúc với vòng tròn tại điểm giữa của nó.

Sau khi hoàn tất, bạn sẽ có "đa giác màu" (thuật ngữ tôi vừa tạo). Sau đó, bạn trích xuất một hình dạng vòng từ đa giác này như một máy cắt cookie làm bằng bột. Sẽ có nhiều cách để làm điều này. Đơn giản chỉ cần vẽ một vòng tròn đầy từ trung tâm đến bán kính bên trong với nền sẽ thoát ra ở phần giữa. Phần bên ngoài sẽ khó khăn hơn. Tôi không biết nếu bạn có thể làm điều này trong WPF nhưng những gì bạn cần làm là tạo ra một mặt nạ đó là một vòng tròn từ trung tâm đến cạnh bên ngoài của vòng. Nó sẽ là một vòng tròn màu trắng trên nền đen. Sau đó bạn "AND" nó với hình ảnh để loại bỏ phần bên ngoài của đa giác.

Không hoàn hảo nhưng có vẻ hợp lý mà tôi nghi ngờ. Rất nhiều trig!

3

Dưới đây là một ví dụ khác từ silverlight: http://asyrovprog.host22.com/colorwheel.html. Mã nguồn được đặt tại đây: timeline.codeplex.com theo giấy phép bsd.

+0

Rất cám ơn! Rất tiếc, tôi không thể xem bản trình diễn vì Silverlight 5 đang trong giai đoạn thử nghiệm, nhưng câu trả lời của bạn dường như được chấp nhận sớm. –