Que dois-je changer pour le code suivant afin que l'arrière-plan soit rouge, aucune des 2 méthodes que j'ai essayées n'a fonctionné:
(source: 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>
Code derrière:
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
}
}
J'ai essayé la réponse d'Aviad qui ne semblait pas fonctionner. Je peux le faire manuellement avec x: Name comme indiqué ici mais je veux pouvoir lier la couleur à une propriété INotifyPropertyChanged, comment puis-je faire cela?
(source: 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>
Code derrière:
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
}
}
Important:
Assurez-vous que vous utilisez System.Windows.Media.Brush
et pas 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 également différente
System.Windows.Media.Colors.Aquamarine (le nom de la classe estColors
) <--- utilisez celui-ci System.Drawing.Color.Aquamarine (le nom de la classe estColor
)
En cas de doute, utilisez Snoop
et inspectez la propriété background de l'élément pour rechercher des erreurs de liaison - ou recherchez simplement dans votre journal de débogage.
La propriété Background
attend un objet Brush
, pas une chaîne. Changez le type de la propriété en Brush
et initialisez-le 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 problème de conflit de nommage: si vous utilisez TheBackground au lieu de Background cela fonctionne comme indiqué 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 recommande de lire l'article de blog suivant sur le débogage de la 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 masqué la propriété Window.Background (ou Control ou toute classe définie par la propriété).
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 l'application Windows 8 Store. Essayez de voir. Bonne chance !
Vous avez attribué une chaîne "Rouge". Votre propriété d'arrière-plan doit être de type Couleur:
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
//...//
}
Ensuite, vous pouvez utiliser la liaison au SolidColorBrush comme ceci:
public Window1()
{
InitializeComponent();
DataContext = this;
Background = Colors.Red;
Message = "This is the title, the background should be " + Background.toString() + ".";
}
pas sûr à 100% de la méthode .toString () sur Color-Object. Cela pourrait vous dire qu'il s'agit d'une classe de couleurs, mais vous comprendrez cela;)
Vous pouvez toujours utiliser "Arrière-plan" comme nom de propriété, tant que vous donnez un nom à votre fenêtre et utilisez ce nom sur la "Source" de la liaison.