Comment lier une couleur de fond dans WPF / XAML?
Qu'est-ce que je dois changer pour le code suivant pour que le fond soit rouge, aucune des 2 façons que j'ai essayé n'a fonctionné:
texte alternatif http://www.deviantsart.com/upload/1okq25l.png
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>
Code Behind:
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
}
}
mise à Jour 1:
J'ai essayé la réponse D'Aviad qui ne semblait pas fonctionner. Je peux le faire manuellement avec x:Name comme montré ici mais je veux pouvoir lier la couleur d'une propriété INotifyPropertyChanged, Comment puis-je faire cela?
texte alternatif http://www.deviantsart.com/upload/7tp48m.png
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>
Code Behind:
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
}
}
7 réponses
Important:
assurez-vous que vous utilisez System.Windows.Media.Brush
et non System.Drawing.Brush
ils ne sont pas compatibles et vous obtiendrez des erreurs de liaison.
l'énumération des couleurs que vous devez utiliser est aussi différente
Système.Windows.Média.Couleur.L'aigue-marine (nom de la classe est Color)
en Cas de doute, utilisez Snoop
et inspecter le fond de l'élément propriété pour la liaison des erreurs - ou tout simplement regarder dans votre journal de débogage.
Background
la propriété attend un Brush
objet, pas une chaîne de caractères. Changer le type de la propriété Brush
et l'initialiser ainsi:
Background = new SolidColorBrush(Colors.Red);
ici vous avez un code copier-coller:
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;
}
}
j'ai compris cela, c'était juste un nom du conflit question: si vous utilisez TheBackground au lieu de Background il fonctionne comme affiché dans le premier exemple. L'arrière-plan de la propriété interférait avec l'arrière-plan de la propriété Window.
je vous recommande la lecture du blog suivant sur le débogage de liaison de données: http://beacosta.com/blog/?p=52
et pour ce problème concret: si vous regardez les avertissements du compilateur, vous remarquerez que votre propriété a caché la fenêtre.Propriété d'arrière-plan (ou contrôle ou n'importe quelle classe que la propriété définit).
le code xaml:
<Grid x:Name="Message2">
<TextBlock Text="This one is manually orange."/>
</Grid>
Le code 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;
}
celui-ci fonctionne dans windows 8 app store. Essayer et voir. Bonne chance !
vous pouvez toujours utiliser " Background "comme nom de propriété, tant que vous donnez un nom à votre fenêtre et utilisez ce nom sur la" Source " de la reliure.