visual tutorial studio que puede programacion presentacion hacer español ejemplos con animaciones c# wpf xaml binding background

c# - tutorial - ¿Cómo puedo vincular un color de fondo en WPF/XAML?



wpf presentacion (7)

¿Qué tengo que cambiar al siguiente código para que el fondo sea rojo, pero ninguna de las 2 formas en que lo intenté funcionó?

texto alternativo 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>

Código detrás:

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 } }

Actualización 1:

Probé la respuesta de Aviad, que no pareció funcionar. Puedo hacer esto manualmente con x: Nombre como se muestra aquí pero quiero poder vincular el color a una propiedad INotifyPropertyChanged, ¿cómo puedo hacer esto?

texto alternativo 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>

Código detrás:

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 } }


Aquí tienes un código de copiar y pegar:

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; } }


El código xaml:

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

El código 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; }

Éste funciona en la aplicación de la tienda de Windows 8. Prueba y mira. Buena suerte !


La propiedad Background espera un objeto Brush , no una cadena. Cambie el tipo de propiedad a Brush e inicialícela así:

Background = new SolidColorBrush(Colors.Red);


Me di cuenta de esto, era solo un problema de conflicto de nombres : si usas TheBackground en lugar de Background , funciona como se publicó en el primer ejemplo. El fondo de la propiedad estaba interfiriendo con el fondo de la propiedad Ventana.


Recomiendo leer la siguiente publicación de blog sobre el enlace de datos de depuración: http://beacosta.com/blog/?p=52

Y para este problema concreto: si observa las advertencias del compilador, observará que su propiedad ha estado ocultando la propiedad Window.Batck (o Control o cualquier clase que la propiedad defina).


Todavía puede usar "Fondo" como nombre de propiedad, siempre que le dé un nombre a su ventana y use este nombre en la "Fuente" del Enlace.


Importante:

Asegúrese de estar utilizando System.Windows.Media.Brush y no System.Drawing.Brush

No son compatibles y obtendrás errores vinculantes.

La enumeración del color que necesita usar también es diferente

System.Windows.Media.Colors.Aquamarine (el nombre de clase es Colors ) <--- use this System.Drawing.Color.Aquamarine (el nombre de clase es Color )

Si tiene dudas, use Snoop e inspeccione la propiedad de fondo del elemento para buscar errores de enlace, o simplemente mire en su registro de depuración.