背景が赤になるように次のコードに何を変更する必要がありますか?
(ソース: 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
}
}
うまくいかないように思えたAviadの答えを試しました。ここに示すようにx:Nameを使用して手動でこれを行うことができますが、色をINotifyPropertyChangedプロパティにバインドできるようにしたいのですが、どうすればよいですか?
(ソース: 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
}
}
重要:
System.Windows.Media.Brush
ではなくSystem.Drawing.Brush
を使用していることを確認してください
それらは互換性がなく、バインディングエラーが発生します。
使用する必要がある色の列挙も異なります
System.Windows.Media.Colors.Aquamarine(クラス名はColors
)<---この1つを使用しますSystem.Drawing.Color.Aquamarine(クラス名はColor
)
疑わしい場合は、Snoop
を使用して、要素のバックグラウンドプロパティを調べてバインディングエラーを探すか、単にデバッグログを調べてください。
Background
プロパティには、文字列ではなくBrush
オブジェクトが必要です。プロパティのタイプをBrush
に変更し、次のように初期化します。
Background = new SolidColorBrush(Colors.Red);
ここにコピーアンドペーストコードがあります:
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;
}
}
私はこれを理解しました、それはただ名前付けの競合の問題:Backgroundの代わりにTheBackgroundを使用する場合、最初の例で投稿されたように動作します。プロパティBackgroundは、Windowプロパティの背景に干渉していました。
データバインディングのデバッグに関する次のブログ投稿を読むことをお勧めします。 http://beacosta.com/blog/?p=52
この具体的な問題については、コンパイラの警告を見ると、プロパティがWindow.Backgroundプロパティ(またはControlまたはプロパティが定義するクラス)を隠していることがわかります。
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ストアアプリで動作します。試してみてください。がんばろう !
文字列「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%確実ではありません。それはそれがカラークラスであると言うかもしれませんが、あなたはこれを理解するでしょう;)
ウィンドウに名前を付け、バインディングの「ソース」でこの名前を使用する限り、「背景」をプロパティ名として使用できます。