System.Windows.Media.Color値をSystem.Windows.Media.Brushに変換したい。色の値は、RectangleオブジェクトのFillプロパティにデータバインドされます。 FillプロパティはBrushオブジェクトを受け取るため、変換を実行するにはIValueConverterオブジェクトが必要です。
WPFに組み込みのコンバーターはありますか、それとも独自のコンバーターを作成する必要がありますか?必要になった場合、自分で作成するにはどうすればよいですか?
独自のコンバーターを作成する必要があるようです。開始する簡単な例を次に示します。
public class ColorToSolidColorBrushValueConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (null == value) {
return null;
}
// For a more sophisticated converter, check also the targetType and react accordingly..
if (value is Color) {
Color color = (Color)value;
return new SolidColorBrush(color);
}
// You can support here more source types if you wish
// For the example I throw an exception
Type type = value.GetType();
throw new InvalidOperationException("Unsupported type ["+type.Name+"]");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
// If necessary, here you can convert back. Check if which brush it is (if its one),
// get its Color-value and return it.
throw new NotImplementedException();
}
}
使用するには、resource-sectionで宣言します。
<local:ColorToSolidColorBrushValueConverter x:Key="ColorToSolidColorBrush_ValueConverter"/>
そして、それを静的リソースとしてバインディングで使用します。
Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}"
私はそれをテストしていません。機能しない場合はコメントしてください。
私は本当にパーティーに遅れていることを知っていますが、あなたはこれのためにコンバーターを必要としません。
できる
<Rectangle>
<Rectangle.Fill>
<SolidColorBrush Color="{Binding YourColorProperty}" />
</Rectangle.Fill>
</Rectangle>
Color
には多くのものがバインドされているため、Jensの方法ではなく、このHCLの方法を使用したかったので、重複やボイラープレート.Fill
ノード。
しかし、書こうとすると、ReSharperは WPF Toolkit のColorToSolidColorBrushConverterの実装を指摘しました。メインのWindow/UserControlノードに次の名前空間宣言を含める必要があります。
xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;Assembly=WPFToolkit.Extended"
次に、Window/UserControlリソースの静的リソース:
<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" />
その後、HCLの答えのようにそれを行うことができます。
<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" />
Converter
はここでは必要ありません。 Brush
でXAML
を定義して使用できます。 Brush
をResource
として定義すると、他の必要な場所で使用できます。
XAML
は次のとおりです。
<Window.Resources>
<SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" />
</Window.Resources>
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" />
HCLの回答をさらに強化して、テストしました-動作します。
public class ColorToSolidColorBrushValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
if (value is Color)
return new SolidColorBrush((Color)value);
throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
if (value is SolidColorBrush)
return ((SolidColorBrush)value).Color;
throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()");
}
}
HCLの回答に加えて、System.Windows.Media.Colorが使用されているかSystem.Drawing.Colorが使用されているかを気にしたくない場合は、このコンバーターを使用できます。
public class ColorToSolidColorBrushValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch (value)
{
case null:
return null;
case System.Windows.Media.Color color:
return new SolidColorBrush(color);
case System.Drawing.Color sdColor:
return new SolidColorBrush(System.Windows.Media.Color.FromArgb(sdColor.A, sdColor.R, sdColor.G, sdColor.B));
}
Type type = value.GetType();
throw new InvalidOperationException("Unsupported type [" + type.Name + "]");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
コンバータ:
[ValueConversion(typeof(SolidColorBrush), typeof(Color))]
public class SolidBrushToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is SolidColorBrush)) return null;
var result = (SolidColorBrush)value;
return result.Color;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML:
//...
<converters:SolidBrushToColorConverter x:Key="SolidToColorConverter" />
//...
<Color>
<Binding Source="{StaticResource YourSolidColorBrush}"
Converter="{StaticResource SolidToColorConverter}">
</Binding>
</Color>
//...