2017-07-10 2 views
0

Ich habe Grid in MainWindow.xaml. Grid ist mit meiner UserControl (geändert Button) gefüllt.Wie ändert man die UserControl-Eigenschaft von der statischen Klasse?

In statischer Klasse Globals, ich habe Bool varible, die bei Button Presse ändern. Jetzt muss ich auch ändern Grid Hintergrundfarbe auf dieser Bool Variable ändern.

Problem ist, dass ich nicht Grid von anderen dann hinter Code MainWindow.xaml.cs erreichen kann.

Global.cs:

public static class Globals 
    { 
     private static bool _player; 
     public static bool Player { 
      get { return _player; } 

      set { 
       _player = value; 
       Debug.WriteLine(value); 
      } 
     } 
    } 

Mein UserControl:

public partial class tetrisButton : UserControl 
    { 
     public tetrisButton() 
     { 
      InitializeComponent(); 
      Button.Focusable = false; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      if(!Globals.Player) 
      { 
       Button.Content = new cross(); 
       Globals.Player = true; 
      } 
      else 
      { 
       Button.Content = new circle(); 
       Globals.Player = false; 
      } 

     } 
    } 
+1

Warum nicht den Hintergrund in Ihrer Klick-Methode zu ändern? –

+0

Sie sollten in Betracht ziehen, dem MVVM-Muster zu folgen –

+1

Seit WPF 4.5 können Sie einfach [an statische Eigenschaften binden] (http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification -für-statische-Eigenschaften). Sie könnten also einfach einen DataTrigger für den Hintergrund des Gitters haben. – Clemens

Antwort

1

Sie können einen Verweis auf das übergeordnete Fenster des UserControl mit dem 012 erhaltenMethode:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MainWindow mainWindow = Window.GetWindow(this) as MainWindow; 
    if (!Globals.Player) 
    { 
     Button.Content = new cross(); 
     Globals.Player = true; 

     if (mainWindow != null) 
      mainWindow.grid.Background = Brushes.Green; 
    } 
    else 
    { 
     Button.Content = new circle(); 
     Globals.Player = false; 

     if (mainWindow != null) 
      mainWindow.grid.Background = Brushes.Red; 
    } 
} 

Um in der Lage sein, die Grid zuzugreifen, können Sie ihm ein x:Name in Ihrem XAML-Markup von MainWindow.xaml geben:

<Grid x:Name="grid" ... /> 
0

Wenn Sie MVVM Muster (oder ähnliches) können Sie die Farbe bekommen konnte nicht implementieren nur das enthalten, Gitter und eingestellt:

public partial class tetrisButton : UserControl 
{ 
    public tetrisButton() 
    { 
     InitializeComponent(); 
     Button.Focusable = false; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Grid parent = FindParent<Grid>(this); 

     if(!Globals.Player) 
     { 
      Button.Content = new cross(); 
      Globals.Player = true; 
      parent.Background = Brushes.Blue; 
     } 
     else 
     { 
      Button.Content = new circle(); 
      Globals.Player = false; 
      parent.Background = Brushes.Red; 
     } 

    } 

    private T FindParent<T>(DependencyObject child) where T : DependencyObject 
    { 
     T parent = VisualTreeHelper.GetParent(child) as T; 

     if (parent != null) 
      return parent; 
     else 
      return FindParent<T>(parent); 
    } 
} 
Verwandte Themen