13

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

バインドについて読んだことはすべて、コレクションとリストに基づいています。文字列変数の値に基づいて、単純に (文字通り) 設定できませんか? 文字列の色 = "赤" 色 = "#FF0000"

4

4 に答える 4

22

他の投稿が参照しているコンバーターが既に存在することを指摘する価値があります。これが<Ellipse Fill="red">、そもそも xaml で実行できる理由です。コンバーターはSystem.Windows.Media.BrushConverter次のとおりです。

        BrushConverter bc = new BrushConverter();
        Brush brush = (Brush) bc.ConvertFrom("Red");

より効率的な方法は、完全な構文を使用することです。

myEllipse.Fill = new SolidColorBrush(Colors.Red);

-1 とコメントに応じて編集:

上記のコードは、元の質問が求めていたものであるcode で完全に正常に動作します。また、必要ありません-IValueConverterこれらは通常、バインディングシナリオに使用されます。ここではATypeConverterが適切なソリューションです (文字列をブラシに一方向に変換しているため)。詳細については、この記事を参照してください。

さらに編集します(Aviadのコメントを読み直しました):Xamlで明示的に使用する必要はありませんTypeConverter-それはあなたのために使用されます。これをXamlで書くと:

<Ellipse Fill="red">

...その後、ランタイムは自動的に a を使用しBrushConverterて、文字列リテラルをブラシに変換します。その Xaml は、本質的に同等のロングハンドに変換されます。

<Ellipse>
  <Ellipse.Fill>
     <SolidColorBrush Color="#FFFF0000" />
  </Ellipse.Fill>             
</Ellipse>

その通りです。Xaml では使用できませんが、その必要はありません。

塗りつぶしとしてバインドしたい文字列値がある場合でも、コンバーターを手動で指定する必要はありません。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て文字列がブラシに変わります。

于 2010-03-16T23:32:00.180 に答える
7

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

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}"
于 2010-03-16T00:13:55.623 に答える