変数に基づいてXAMLで定義されている楕円の色をプログラムで変更するにはどうすればよいですか?
バインディングについて読んだものはすべてコレクションとリストに基づいています-文字列変数の値に基づいて単純に(そして文字通りに)設定することはできませんか? string color = "red" color = "#FF0000"
他の投稿が参照しているコンバーターすでに存在しているであることを指摘する価値があります。そのため、最初にxamlで<Ellipse Fill="red">
を実行できます。コンバーターはSystem.Windows.Media.BrushConverter
です:
BrushConverter bc = new BrushConverter();
Brush brush = (Brush) bc.ConvertFrom("Red");
より効率的な方法は、完全な構文を使用することです。
myEllipse.Fill = new SolidColorBrush(Colors.Red);
[〜#〜] edit [〜#〜]-1とコメントへの応答:
上記のコードは完全に正常に機能しますコード内、これは元の質問が尋ねていたものです。また、do n'tIValueConverter
が必要です-これらは通常bindingシナリオで使用されます。ここではTypeConverter
が適切な解決策です(文字列をブラシに一方向に変換しているため)。詳細については、 この記事 を参照してください。
さらに編集(Aviadのコメントを読み直してください):XamlでTypeConverter
を明示的に使用する必要はありません-それはあなたのために使用されます。これをXamlで書くと:
<Ellipse Fill="red">
...次に、ランタイムは自動的にBrushConverter
を使用して、文字列リテラルをブラシに変換します。そのXamlは、基本的に同等のロングハンドに変換されます。
<Ellipse>
<Ellipse.Fill>
<SolidColorBrush Color="#FFFF0000" />
</Ellipse.Fill>
</Ellipse>
つまり、その通りです。Xamlでは使用できませんが、使用する必要はありません。
bindを塗りつぶしたい文字列値がある場合でも、コンバータを手動で指定する必要はありません。 Kaxamlからのこのテスト:
<Page
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;Assembly=mscorlib">
<Page.Resources>
<s:String x:Key="col">Red</s:String>
</Page.Resources>
<StackPanel>
<Ellipse Width="20" Height="20" Fill="{Binding Source={StaticResource col}}" />
</StackPanel>
</Page>
不思議なことに、StaticResource col
を使用してこの作業を行うことはできませんが、バインドすると、自動的にValueConverter
を使用して文字列がブラシに変わります。
あなたがする必要があるのは、色をブラシオブジェクトに変換するカスタムコンバーターを実装することです。このようなもの...
public class ColorToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
System.Drawing.Color col = (System.Drawing.Color)value;
Color c = Color.FromArgb(col.A, col.R, col.G, col.B);
return new System.Windows.Media.SolidColorBrush(c);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush c = (SolidColorBrush)value;
System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B);
return col;
}
}
そして、バインディングでそのコンバーターを指定します
Fill = "{Binding Colors.Red、Converter = {StaticResource ColorToBrushConverter}"
使用する
System.Windows.Media
XAMLの楕円の名前がmy_ellipse
の場合、
次のように記述します。
my_ellipse.Fill = System.Windows.Media.Brushes.Red;
またはこれ:
my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")