Как изменить backgroud окна WPF с помощью триггера данных?
Я хочу изменить цвет фона главного окна наших приложений при изменении свойства. У нас есть деловая дата, которую можно изменить, и я хочу изменить фон окна, когда он изменился от ожидаемого. Я создал свойство, чтобы рассказать об этом. Но могу ли я установить стиль datatrigger на окне, которое само изменяется? Или мне нужно будет сделать это в приложении.в XAML?
4 ответа:
В конце концов я сделал то, что предложил Дрю. Вот только я не использовал свойство зависимостей.
<Window.Resources> <SolidColorBrush x:Key="windowBGBrush" Color="Green"/> <SolidColorBrush x:Key="windowBGBrushBusinessDateChanged" Color="Red"/> </Window.Resources> <Window.Style > <Style TargetType="{x:Type Window}"> <Setter Property="Background" Value="{DynamicResource windowBGBrush}"/> <Style.Triggers> <DataTrigger Binding="{Binding IsBusinessDateChanged}" Value="true"> <Setter Property="Background" Value="{DynamicResource windowBGBrushBusinessDateChanged}"/> </DataTrigger> </Style.Triggers> </Style> </Window.Style>
IsBusinessDateChanged
это свойство в моей Viewmodel, которое устанавливается службой. Я не знаю, почему это было так трудно.
Если вы предоставляете пользовательское свойство в окне, просто убедитесь, что оно определено как DependencyProperty, и тогда вы сможете использовать обычный триггер в стиле, чтобы реагировать на это свойство. Вот так:
<Window.Style> <Style TargetType="{x:Type MyWindow}"> <Style.Triggers> <Trigger Property="MyProperty" Value="True"> <Setter Property="Background" Value="Red" /> </Trigger> </Style.Triggers> </Style> </Window.Style>
Вот решение с конвертерным подходом:
XAML:
<Window x:Class="StackOverflowTests.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" x:Name="window1" Width="300" xmlns:local="clr-namespace:StackOverflowTests"> <Window.Resources> <local:DateToColorConverter x:Key="DateToColorConverter" /> </Window.Resources> <Window.Background> <SolidColorBrush Color="{Binding ElementName=textBoxName, Path=Text, Converter={StaticResource DateToColorConverter}}" /> </Window.Background> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBox x:Name="textBoxName" Margin="5"></TextBox> </Grid> </Window>
C#:
using System; using System.Windows; using System.Windows.Data; using System.Windows.Media; namespace StackOverflowTests { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } } public class DateToColorConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { DateTime date; if (DateTime.TryParse(value.ToString(), out date)) { if (date == DateTime.Today) return Colors.Green; else return Colors.Red; } else { return Colors.Gold; } } public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new System.NotImplementedException(); } #endregion } }