5 Stimmen

Wie man ein WPF-Fenster Hintergrund mit einem Daten-Trigger ändern?

Ich möchte die Hintergrundfarbe des Hauptfensters unserer Anwendung ändern, wenn sich eine Eigenschaft ändert. Wir haben ein Geschäftsdatum, das geändert werden kann, und ich möchte den Fensterhintergrund ändern, wenn er sich gegenüber der Erwartung geändert hat. Ich habe eine Eigenschaft eingerichtet, um dies mitzuteilen. Aber kann ich einen Style-Datentrigger auf ein Fenster setzen, das sich selbst ändert? Oder müsste ich dies in der app.xaml tun?

0 Stimmen

Ich kann das mit dem Einbinden direkt in die Farbe hinbekommen, wie Codism vorgeschlagen hat. Mit einem Konverter, wie Carlos sagte. Aber nicht mit DP's. Das scheint das Beste zu sein, da ich einen Stil festlegen und ihn später bei Bedarf ändern kann. Übersehe ich etwas?

10voto

nportelli Punkte 3866

Ich habe dann so getan, was Drew vorgeschlagen hat. Nur habe ich keine Abhängigkeitseigenschaft verwendet.

<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 ist eine Eigenschaft auf meinem Viewmodel, die durch einen Dienst festgelegt wird. Ich bin nicht sicher, warum dies so schwer war.

2voto

Drew Marsh Punkte 32833

Wenn Sie eine benutzerdefinierte Eigenschaft auf dem Fenster darlegen, stellen Sie sicher, dass sie als DependencyProperty definiert ist, und dann sollten Sie in der Lage sein, einen regulären Trigger im Stil zu verwenden, um auf die Eigenschaft zu reagieren. Zum Beispiel so:

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

1voto

Carlo Punkte 25454

Hier ist eine Lösung mit einem Konverteransatz:

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
    }

}

-1voto

Codism Punkte 5432

Vielleicht ist es besser, nur den Hintergrund mit der Eigenschaft zu verbinden. Sie müssen die Datenquelle des Fensters auf das Objekt setzen und benötigen möglicherweise einen Wertkonverter.

0 Stimmen

Siehe die StyleTrigger oben. Sie wollen die Darstellung nicht als Teil Ihrer Daten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X