web-dev-qa-db-ja.com

WPF / XAMLで背景色をバインドするにはどうすればよいですか?

背景が赤になるように次のコードに何を変更する必要がありますか?

alt text
(ソース: deviantsart.com

XAML:

<Window x:Class="TestBackground88238.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}" Background="{Binding Background}"/>

        <TextBlock Text="{Binding Message}">
            <TextBlock.Background>
                <SolidColorBrush Color="{Binding Background}"/>
            </TextBlock.Background>
        </TextBlock>

    </StackPanel>
</Window>

コードビハインド:

using System.Windows;
using System.ComponentModel;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private string _background;
        public string Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion



        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Background = "Red";
            Message = "This is the title, the background should be " + Background + ".";

        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}

更新1:

うまくいかないように思えたAviadの答えを試しました。ここに示すようにx:Nameを使用して手動でこれを行うことができますが、色をINotifyPropertyChangedプロパティにバインドできるようにしたいのですが、どうすればよいですか?

alt text
(ソース: deviantsart.com

XAML:

<Window x:Class="TestBackground88238.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}" Background="{Binding Background}"/>

        <TextBlock x:Name="Message2" Text="This one is manually orange."/>

    </StackPanel>
</Window>

コードビハインド:

using System.Windows;
using System.ComponentModel;
using System.Windows.Media;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private Brush _background;
        public Brush Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Background = new SolidColorBrush(Colors.Red);
            Message = "This is the title, the background should be " + Background + ".";

            Message2.Background = new SolidColorBrush(Colors.Orange);

        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}
31
Edward Tanguay

重要:

System.Windows.Media.BrushではなくSystem.Drawing.Brushを使用していることを確認してください

それらは互換性がなく、バインディングエラーが発生します。

使用する必要がある色の列挙も異なります

System.Windows.Media.Colors.Aquamarine(クラス名はColors)<---この1つを使用しますSystem.Drawing.Color.Aquamarine(クラス名はColor

疑わしい場合は、Snoopを使用して、要素のバックグラウンドプロパティを調べてバインディングエラーを探すか、単にデバッグログを調べてください。

52
Simon_Weaver

Backgroundプロパティには、文字列ではなくBrushオブジェクトが必要です。プロパティのタイプをBrushに変更し、次のように初期化します。

Background = new SolidColorBrush(Colors.Red);
22
Aviad P.

ここにコピーアンドペーストコードがあります:

class NameToBackgroundConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(value.ToString() == "System")
            {
                return new SolidColorBrush(System.Windows.Media.Colors.Aqua);
            }else
            {
                return new SolidColorBrush(System.Windows.Media.Colors.Blue);
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
7
Andrzej Gis

私はこれを理解しました、それはただ名前付けの競合の問題Backgroundの代わりにTheBackgroundを使用する場合、最初の例で投稿されたように動作します。プロパティBackgroundは、Windowプロパティの背景に干渉していました。

3
Edward Tanguay

データバインディングのデバッグに関する次のブログ投稿を読むことをお勧めします。 http://beacosta.com/blog/?p=52

この具体的な問題については、コンパイラの警告を見ると、プロパティがWindow.Backgroundプロパティ(またはControlまたはプロパティが定義するクラス)を隠していることがわかります。

3
Oliver Hanappi

Xamlコード:

<Grid x:Name="Message2">
   <TextBlock Text="This one is manually orange."/>
</Grid>

C#コード:

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        CreateNewColorBrush();
    }

    private void CreateNewColorBrush()
    {

        SolidColorBrush my_brush = new SolidColorBrush(Color.FromArgb(255, 255, 215, 0));
        Message2.Background = my_brush;

    }

これは、Windows 8ストアアプリで動作します。試してみてください。がんばろう !

2
Eranda

文字列「Red」を割り当てました。 BackgroundプロパティのタイプはColorである必要があります。

using System.Windows;
using System.ComponentModel;

namespace TestBackground88238
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: Background
        private Color _background;
        public Color Background
        {
            get
            {
                return _background;
            }

            set
            {
                _background = value;
                OnPropertyChanged("Background");
            }
        }
        #endregion

        //...//
}

次に、SolidColorBrushへのバインディングを次のように使用できます。

public Window1()
{
    InitializeComponent();
    DataContext = this;

    Background = Colors.Red;
    Message = "This is the title, the background should be " + Background.toString() + ".";

}

color-Objectの.toString()メソッドについて100%確実ではありません。それはそれがカラークラスであると言うかもしれませんが、あなたはこれを理解するでしょう;)

0
thewhiteambit

ウィンドウに名前を付け、バインディングの「ソース」でこの名前を使用する限り、「背景」をプロパティ名として使用できます。

0
Gus Cavalcanti