Có cách nào để xác định hoạt ảnh ở đâu đó trong xaml (ví dụ như tài nguyên) một lần và sau đó sử dụng lại nhiều lần không? Tôi có rất nhiều bàn chải độc lập trên các bảng dữ liệu khác nhau mà độc lập cần phải bắt đầu cùng một loại hình động dựa trên một bộ dữ liệu. Bây giờ vì có vẻ như một hoạt ảnh phải xác định một Storyboard.TargetName và Storyboard.TargetProperty. Điều này khá nhiều đánh bại mục đích của reusability. Tôi bằng cách nào đó muốn tuyên bố "sử dụng hình ảnh động này tạo thành tài nguyên nhưng áp dụng nó cho một yếu tố khác thời gian này".xác định hoạt ảnh và trình kích hoạt làm tài nguyên có thể sử dụng lại?
Với tôi điều này có vẻ là một yêu cầu khá cơ bản, quan trọng và cần thiết và tôi ngạc nhiên rằng nó không thẳng về phía trước để hoàn thành. Am i thiếu cái gì ở đây?
Điều tương tự cũng áp dụng cho trình kích hoạt. Giả sử tôi có rất nhiều yếu tố hình ảnh khác nhau mà tất cả đều thể hiện cùng một loại trạng thái bằng cách sử dụng hình động màu. Ví dụ. phai màu xanh lá cây khi "hoạt động" phai sang "màu đỏ" khi "lỗi", vv Sự khác biệt duy nhất giữa hình ảnh là hình dạng/cây hình ảnh của họ, hành vi hoạt hình mong muốn giống nhau, tất cả đều có phần tử ở đâu đó trong cây thị giác của họ một thuộc tính của loại màu. Tôi nghĩ rằng nó không phải là khó để tưởng tượng như thế nào tẻ nhạt nó là để xác định lại các hình ảnh động tương tự và datatrigger đặt hơn và hơn nữa. Mọi nhà phát triển đều ghét điều này. Tôi tuyệt vọng tìm kiếm một giải pháp dễ dàng hơn mà không yêu cầu (hoặc ít nhất là rất ít) mã C# phía sau.
Những gì tôi đã đưa ra cho đến nay là thế này:
Xác định hình ảnh động trong một nguồn tài nguyên Lik này (lặp lại điều này cho tất cả các quốc gia cơ bản mà có, như kích hoạt, năng động, không hoạt động, lỗi):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
việc sử dụng nó trong kịch bản trong trigger (lặp lại zillions này lần cho mỗi tiểu bang X mỗi stateviusal differnt, luôn luôn đưa ra một tên mới cho kịch bản):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
Bạn có thể dễ dàng hình dung XAML bloat nhiều đến mức nào tôi phải sao chép và dán liên tục cho tất cả những DataTriggers hàng tỷ.
Sẽ thật tuyệt khi xác định tất cả các trình kích hoạt này một lần và áp dụng cho các hình ảnh trạng thái khác nhau. Làm thế nào là một cái gì đó như thế này được giải quyết trong WPF? Bất kỳ mẹo nào?
Ya biết tôi đã thử một loạt các thứ khác nhau để đưa ra một gợi ý cho điều này và nó chỉ là không thể mà không làm một cái gì đó trong mã. Đây là một giải pháp tốt như tôi nghĩ bạn sẽ nhận được. Hurray cho WPF mở rộng, phải không? :) –
Có thể nên sử dụng API hành vi Silverlight cho việc này. Bạn có đồng ý không? IS có tương thích với chuẩn 3.5 .net framework không? – bitbonk
Không, nó không tương thích, mặc dù chúng được cho là vậy. Thành thật mà nói, tôi nghĩ rằng bạn đã tìm thấy một giải pháp tuyệt vời thúc đẩy kiến trúc WPF một cách rất tự nhiên và không nên tự đoán mình ở đây. –