2014-11-05 2 views
0

Я создал страницу WPF, и у меня должна быть возможность изменить тему (темная тема и светлая тема). Я новичок в WPF и нашел решение моей проблемы с помощью DataTrigger, но это не работает. Через 3 часа я пытался как 10 различных решений/учебники, но я не знаю, что я делаю неправильно ...WPF DataTrigger не работает.

Код XML:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:VMQWPFApplication.Pages" x:Class="VMQWPFApplication.Pages.MainPage" 
    mc:Ignorable="d" 
    d:DesignHeight="400" d:DesignWidth="600" 
Title="MainPage"> 

<Page.Resources> 
    <Style x:Key="styleWithTrigger" TargetType="{x:Type Rectangle}"> 
     <Setter Property="Fill" Value="Blue"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding DarkTheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainPage}}}" Value="True"> 
       <Setter Property="Fill" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Page.Resources> 

<DockPanel> 
    <!--Toolbar--> 
    ... 

    <!--Body--> 
    <Grid> 
     <Rectangle Style="{StaticResource styleWithTrigger}"/> 
    </Grid> 
</DockPanel> 

А вот CS:

namespace VMQWPFApplication.Pages 
{ 
    /// <summary> 
    /// Interaction logic for MainPage.xaml 
    /// </summary> 
    public partial class MainPage : Page 
    { 
     public bool DarkTheme { get; set; } 

     public MainPage() 
     { 
      InitializeComponent(); 
      DarkTheme = false; 
     } 

     private void TestButton_Click(object sender, RoutedEventArgs e) 
     { 
      DarkTheme = true; 
     } 
    } 
} 

В начале прямоугольник синий, но он не изменится.

+3

поиска для 'INotifyPropertyChanged', вы должны реализовать этот интерфейс для ViewModel и повысить свойство правильно изменилось. –

+0

@MrApfelstrudel 'MainPage' не реализует интерфейс' INotifyPropertyChanged', а 'DarkTheme' не вызывает событие' PropertyChanged' или не делает 'DarkTheme'' DependencyProperty' – dkozl

+1

. Я бы также поставил ваш контекст данных на странице. DataContext = "{Binding RelativeSource {RelativeSource Self}}" –

ответ

2

В файле MainPage.xaml.cs не реализован интерфейс INotifyPropertyChanged. Для этого необходимо добавить/изменить следующим образом:

public partial class MainPage : Page, INotifyPropertyChanged 

#region INotifyPorpertyChanged Memebers 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

#endregion 

Я хотел бы изменить свою собственность DarkTheme на:

private bool _darkTheme; 
public bool DarkTheme { get { return _darkTheme; } set { _darkTheme = value; NotifyPropertyChanged("DarkTheme"); } 

Теперь, когда вы обновляете DarkTheme это поднимет Изменить событие собственности. Я хотел бы также поставить DataContext в страницу составляют:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

 Смежные вопросы

  • Нет связанных вопросов^_^