Was muss ich in den folgenden Code ändern, damit der Hintergrund rot ist? Keine der beiden Möglichkeiten, die ich ausprobiert habe:
(Quelle: 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 dahinter:
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
}
}
Ich versuchte es mit Aviads Antwort, die anscheinend nicht funktionierte. Ich kann dies manuell mit x: Name tun, wie hier gezeigt, aber ich möchte die Farbe an eine INotifyPropertyChanged-Eigenschaft binden können. Wie kann ich das tun?
(Quelle: 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 dahinter:
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
}
}
Wichtig:
Stellen Sie sicher, dass Sie System.Windows.Media.Brush
Und nicht System.Drawing.Brush
Verwenden.
Sie sind nicht kompatibel und Sie erhalten Bindungsfehler.
Die zu verwendende Farbenzählung ist ebenfalls unterschiedlich
System.Windows.Media.Colors.Aquamarine (Klassenname istColors
) <--- Verwenden Sie dieses System.Drawing.Color.Aquamarine (Klassenname istColor
)
Im Zweifelsfall verwenden Sie Snoop
und überprüfen Sie die Hintergrundeigenschaft des Elements auf Bindungsfehler - oder schauen Sie einfach in Ihr Debug-Protokoll.
Die Eigenschaft Background
erwartet ein Brush
-Objekt und keine Zeichenfolge. Ändern Sie den Typ der Eigenschaft in Brush
und initialisieren Sie ihn folgendermaßen:
Background = new SolidColorBrush(Colors.Red);
Hier haben Sie einen Code zum Kopieren und Einfügen:
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;
}
}
Ich habe das herausgefunden, es war nur ein Namenskonfliktproblem: Wenn Sie TheBackground anstelle von Background verwenden, funktioniert es wie im ersten Beispiel beschrieben. Die Eigenschaft Hintergrund hat den Hintergrund der Fenstereigenschaft beeinträchtigt.
Ich empfehle, den folgenden Blogeintrag zum Debuggen der Datenbindung zu lesen: http://beacosta.com/blog/?p=52
Und zu diesem konkreten Problem: Wenn Sie sich die Compiler-Warnungen ansehen, werden Sie feststellen, dass Ihre Eigenschaft die Window.Background-Eigenschaft (oder Control oder eine von der Eigenschaft definierte Klasse) ausgeblendet hat.
Der XAML-Code:
<Grid x:Name="Message2">
<TextBlock Text="This one is manually orange."/>
</Grid>
Der c # Code:
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;
}
Dieser funktioniert in Windows 8 Store App. Versuchen Sie und sehen Sie. Viel Glück !
Sie haben eine Zeichenfolge "Rot" zugewiesen. Ihre Background-Eigenschaft sollte vom Typ Color sein:
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
//...//
}
Dann können Sie die Bindung an den SolidColorBrush wie folgt verwenden:
public Window1()
{
InitializeComponent();
DataContext = this;
Background = Colors.Red;
Message = "This is the title, the background should be " + Background.toString() + ".";
}
nicht 100% sicher über die .toString () -Methode für Color-Object. Es könnte dir sagen, dass es eine Farbklasse ist, aber du wirst es herausfinden;)
Sie können weiterhin "Hintergrund" als Eigenschaftsname verwenden, solange Sie Ihrem Fenster einen Namen geben und diesen Namen in der "Quelle" der Bindung verwenden.