web-dev-qa-db-ja.com

楕円の塗りつぶしの色を変更するWPFバインディング

変数に基づいてXAMLで定義されている楕円の色をプログラムで変更するにはどうすればよいですか?

バインディングについて読んだものはすべてコレクションとリストに基づいています-文字列変数の値に基づいて単純に(そして文字通りに)設定することはできませんか? string color = "red" color = "#FF0000"

10
user294382

他の投稿が参照しているコンバーターすでに存在しているであることを指摘する価値があります。そのため、最初に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を使用して文字列がブラシに変わります。

17
Dan Puzey

あなたがする必要があるのは、色をブラシオブジェクトに変換するカスタムコンバーターを実装することです。このようなもの...

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}" 
6
Leigh S

使用する

System.Windows.Media

XAMLの楕円の名前がmy_ellipseの場合、
次のように記述します。

my_ellipse.Fill = System.Windows.Media.Brushes.Red;

またはこれ:

my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")
2
Alex Stoliar