Thật không may, bàn chải tùy chỉnh không được hỗ trợ trong WPF (các loại bàn chải được đánh dấu 'nội' và không thể được thừa hưởng từ), do đó tạo ra một bàn chải đó là một hỗn hợp của hai bàn chải có thể được sử dụng từ XAML như một SolidColorBrush bình thường là không thể. Để giải quyết sự cố, bạn có thể sử dụng MarkupExtension để mô phỏng hành vi của một cọ vẽ tùy chỉnh, cho phép bạn sử dụng cú pháp XAML và cung cấp giá trị tùy chỉnh, cho phép chúng tôi sử dụng SolidColorBrush tích hợp sẵn (không cần bàn chải tùy chỉnh).) để thiết lập các giá trị mà bạn nhận được khi trộn hai màu:
/// <summary>
/// Markup extension to mix two SolidColorBrushes together to produce a new SolidColorBrush.
/// </summary>
[MarkupExtensionReturnType(typeof(SolidColorBrush))]
public class MixedColorBrush : MarkupExtension, INotifyPropertyChanged
{
/// <summary>
/// The foreground mix color; defaults to white.
/// If not changed, the result will always be white.
/// </summary>
private SolidColorBrush foreground = Brushes.White;
/// <summary>
/// The background mix color; defaults to black.
/// If not set, the result will be the foreground color.
/// </summary>
private SolidColorBrush background = Brushes.Black;
/// <summary>
/// PropertyChanged event for WPF binding.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Gets or sets the foreground mix color.
/// </summary>
public SolidColorBrush Foreground
{
get
{
return this.foreground;
}
set
{
this.foreground = value;
this.NotifyPropertyChanged("Foreground");
}
}
/// <summary>
/// Gets or sets the background mix color.
/// </summary>
public SolidColorBrush Background
{
get
{
return this.background;
}
set
{
this.background = value;
this.NotifyPropertyChanged("Background");
}
}
/// <summary>
/// Returns a SolidColorBrush that is set as the value of the
/// target property for this markup extension.
/// </summary>
/// <param name="serviceProvider">Object that can provide services for the markup extension.</param>
/// <returns>The object value to set on the property where the extension is applied.</returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (this.foreground != null && this.background != null)
{
// Create a new brush as a composite of the old ones
// This does simple non-perceptual additive color, e.g
// blue + red = magenta, but you can swap in a different
// algorithm to do subtractive color (red + yellow = orange)
return new SolidColorBrush(this.foreground.Color + this.background.Color);
}
// If either of the brushes was set to null, return an empty (white) brush.
return new SolidColorBrush();
}
/// <summary>
/// Raise the property changed event.
/// </summary>
/// <param name="propertyName">Name of the property which has changed.</param>
protected void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
nào sau đó có thể được sử dụng từ XAML như bạn làm một bàn chải bình thường:
<Grid>
<Grid.Background>
<local:MixedColorBrush Foreground="Blue" Background="Red"/>
</Grid.Background>
</Grid>
Hoặc bằng cách sử dụng cú pháp mở rộng đánh dấu:
<Grid Background="{local:MixedColorBrush Foreground=Blue, Background=Red}">
Nhược điểm của phương pháp này là bạn không thể sử dụng tham chiếu DynamicResource hoặc StaticResource để liên kết các giá trị với các tài nguyên khác trong ứng dụng của bạn. MarkupExtension không phải là DependencyObject và liên kết tài nguyên chỉ hoạt động trên DependencyObjects; các Brushes tích hợp là DependencyObjects, đó là lý do tại sao việc liên kết hoạt động với các cọ vẽ truyền thống.
Nguồn
2009-05-25 23:51:39
Ví dụ tốt ...nhưng tôi đã hy vọng phiên bản XAML này ... – Entrodus