3

3つのテキストボックスと1つのラベルがあります。ラベルは、マルチコンバーターを使用してテキストボックス内のテキストにバインドされます。

XAML:

<Label Name="lbl" Content="Label" HorizontalAlignment="Left" Margin="336,128,0,0" VerticalAlignment="Top" Height="57" Width="93">
        <Label.Background>
            <MultiBinding Converter="{StaticResource converta}">
                <Binding ElementName="R" Path="Text" Mode="TwoWay" />
                <Binding ElementName="G" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
                <Binding ElementName="B" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
            </MultiBinding>

        </Label.Background>
    </Label> 
    <TextBox Name="R" HorizontalAlignment="Left" Height="23" Margin="250,214,0,0" TextWrapping="Wrap" Text="255" VerticalAlignment="Top" Width="120"/>
    <TextBox Name="B" HorizontalAlignment="Left" Height="23" Margin="271,242,0,0" TextWrapping="Wrap" Text="255" VerticalAlignment="Top" Width="120"/>
    <TextBox Name="G" HorizontalAlignment="Left" Height="23" Margin="155,275,0,0" TextWrapping="Wrap" Text="255" VerticalAlignment="Top" Width="120"/>

コンバータ

class converter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {

            return new System.Windows.Media.SolidColorBrush(Color.FromRgb(System.Convert.ToByte((values[0] as string)), System.Convert.ToByte((values[1] as string)), System.Convert.ToByte((values[2] as string))));

    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        byte R = (value as System.Windows.Media.Color?).Value.R;
        byte G = (value as System.Windows.Media.Color?).Value.G;
        byte B = (value as System.Windows.Media.Color?).Value.B;
        return new string[] {System.Convert.ToString(R),System.Convert.ToString(G),System.Convert.ToString(B)};

    }
    }

(明らかに、現実の世界では、検証と型チェックを追加します)。

次に、ラベルの背景を設定するボタンを追加します。これは次のような単純なものです。

    lbl.Background= new SolidColorBrush(Color.FromRgb(
System.Convert.ToByte(121), 
System.Convert.ToByte(43), 
System.Convert.ToByte(15)));

明らかに、それはバインディングを壊します。だから私は試してみます:

    SetCurrentValue(lbl.BackgroundProperty, 
new SolidColorBrush(
Color.FromRgb(System.Convert.ToByte(121), 
System.Convert.ToByte(43), 
System.Convert.ToByte(15))));

しかし、VSはそれを不平を言います

メンバー'System.Windows.Controls.Control.BackgroundProperty'には、インスタンス参照を使用してアクセスできません。代わりにタイプ名で修飾してください

バインディングを壊さずにコードでラベルの背景の値を設定するにはどうすればよいですか?

注:これはWPF、.Net4.5です。

4

2 に答える 2

8

エラーは自明であり、lbl.BackgroundPropertyをそのように設定できないことを示しています。以下はこれを行う正しい方法です。

        lbl.SetCurrentValue(BackgroundProperty,
                                   new SolidColorBrush(Color.FromRgb(System.Convert.ToByte(121),
                                                                     System.Convert.ToByte(43),
                                                                     System.Convert.ToByte(15))));
于 2013-03-18T12:19:41.917 に答える
1

私はおそらくRGB値を依存関係プロパティとして保持しますが、必要に応じてコードビハインドから変更できます。

結果

ここに画像の説明を入力してください

XAML

<Window x:Class="test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:test"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.Background>
                <MultiBinding Converter="{local:RGBtoBrushConverter}">
                    <MultiBinding.Bindings>
                        <Binding Path="R"/>
                        <Binding Path="G"/>
                        <Binding Path="B"/>
                    </MultiBinding.Bindings>
                </MultiBinding>
            </Grid.Background>
        </Grid>

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <TextBox Grid.Column="0" Text="{Binding R, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Grid.Column="1" Text="{Binding G, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Grid.Column="2" Text="{Binding B, UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </Grid>
</Window>

コード

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace test
{

    public class RGBtoBrushConverter : MarkupExtension, IMultiValueConverter
    {
        static RGBtoBrushConverter converter;
        public RGBtoBrushConverter() { }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            if (converter == null) converter = new RGBtoBrushConverter();
            return converter;
        }
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                byte R = System.Convert.ToByte(values[0]);
                byte G = System.Convert.ToByte(values[1]);
                byte B = System.Convert.ToByte(values[2]);
                return new System.Windows.Media.SolidColorBrush(Color.FromArgb(byte.MaxValue, R, G, B));
            }
            catch { return Brushes.Purple; }
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public partial class MainWindow : Window
    {
        public int R
        {
            get { return (int)GetValue(RProperty); }
            set { SetValue(RProperty, value); }
        }
        public static readonly DependencyProperty RProperty = DependencyProperty.Register("R", typeof(int), typeof(MainWindow), new PropertyMetadata(0));

        public int G
        {
            get { return (int)GetValue(GProperty); }
            set { SetValue(GProperty, value); }
        }
        public static readonly DependencyProperty GProperty = DependencyProperty.Register("G", typeof(int), typeof(MainWindow), new PropertyMetadata(0));
        public int B
        {
            get { return (int)GetValue(BProperty); }
            set { SetValue(BProperty, value); }
        }
        public static readonly DependencyProperty BProperty = DependencyProperty.Register("B", typeof(int), typeof(MainWindow), new PropertyMetadata(0));


        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
于 2013-03-18T11:58:05.307 に答える