2016-09-27 3 views
1

Я пытаюсь создать простую автономную сборку Unity Standalone (для аркадного шкафа) - настройка суперпростая - джойстик вверх и вниз выделяет игру (в этом случае изменяя цвет заливки прямоугольник и button1 lauches правильную игру. я сдуру подумал, что я мог сделать это просто в МОФ, но наткнулись на первое препятствие.wpf Значения DataTrigger не обновляются

у меня есть ввод с клавиатуры (аркада джойстик настройки через I-PAC2) работает (блокировка фокуса на главном окне) и меняет целое число от 0 до 6. Это работает (ура) через код на MainWindow и передается статическому int под названием позиция.

Затем я намереваюсь иметь ряд прямоугольников, которые выделяют на основе этой величины int. Я тестировал на одном прямоугольнике - используя dataTrigger для изменения состояния, но он не обновляется на входе в клавиатуру. код ...

ножницы
<Rectangle x:Name="gameRect01" Height="74" Margin="10,93,32.667,0" VerticalAlignment="Top" Grid.ColumnSpan="2" IsEnabled="False"> 
     <Rectangle.DataContext> 
      <local:Launcher/> 
     </Rectangle.DataContext> 
     <Rectangle.Style> 
      <Style TargetType="Rectangle"> 
       <Setter Property="Fill" Value="Red" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path = cursorPos, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Value="1"> 
         <Setter Property="Fill" Value="Green" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Rectangle.Style> 

и класс Launcher ...

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Diagnostics; 
    using System.ComponentModel; 

    namespace GameLauncher 
    { 
     class Launcher : INotifyPropertyChanged 
     { 
     public static int position = 0; 

    public int cursorPos 
    { 
     get 
     { return position; 
     } 
     set 
     { 
      cursorPos = position; 
      RaisePropertyChanged("cursorPos"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 
} 

}

код XAML, кажется, связываясь с cursorPos - если я изменить значение в привязка, прямоугольник меняет заливку.

ввода Клавиатура, безусловно, изменяя значение позиции но значение не обновляется внутри cursorPos.

Я чувствую, что мне не хватает чего-то чрезвычайно простого, но не могу найти ничего, что помогло бы (я искал и пытался пробовать изменения за последние 3 ночи без везения). Я бы очень признателен за то, что кто-то новичок в этом.

Спасибо, Peter

Update Я обновил Launcher на основе обратной связи ниже, чтобы ...

namespace GameLauncher 
{ 
class Launcher : INotifyPropertyChanged 
{ 
    private int _position; 

    public int cursorPos 
    { 
     get { 
      return _position; 
     } 
     set { 
      _position = value; 
      RaisePropertyChanged(nameof(cursorPos)); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 

и мой ввод с клавиатуры код выглядит следующим образом ...

namespace GameLauncher 
{ 
public partial class MainWindow : Window 
{ 
    Launcher launcher = new Launcher(); 
    private string gameGet; 


    public MainWindow() 
    { 
     InitializeComponent(); 
     this.KeyDown += new KeyEventHandler(OnButtonKeyDown); 

    } 

    public void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Down || e.Key == Key.F) { 
      launcher.cursorPos = Math.Min(6, launcher.cursorPos + 1); Debug.WriteLine(launcher.cursorPos); 
     } 

     if (e.Key == Key.Up || e.Key == Key.R) { 
      launcher.cursorPos = Math.Max(0, launcher.cursorPos - 1); Debug.WriteLine(launcher.cursorPos); 
     } 

     if (e.Key == Key.LeftCtrl || e.Key == Key.LeftAlt || e.Key == Key.A || e.Key == Key.S || e.Key == Key.D1 || e.Key == Key.D2){ 
     // gameGet = "testGame"; 
     } 

    } 

    private void PlayButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Launcher.PlayGame("test"); 
    } 
} 

}

XAML-код такой же, но его не обновляет - gah. Единственное, о чем я могу думать сейчас, это то, что, создавая экземпляр класса Launcher для вызова MainWindow, это неверно, и я должен делать это по-другому?

+1

Событие PropertyChanged только уволен, если присвоить значение в 'cursorPos' собственности. Просто установка поля 'position' не будет работать. – Clemens

+0

Спасибо за быстрый ответ Это то место, где я смотрел (я думал, что обновление cursorPos на множестве сделает это) - как бы я это сделал в этой ситуации? –

ответ

0

В целом это хорошая идея, чтобы сделать ваши поля приватным и дать доступ по свойствам:

public static int position = 0; 

должен быть

private /*static*/ int position = 0; 

Я заметил статическими, потому что вы должны использовать его только тогда, когда это действительно необходимо.

Заменить все position = ...;cursorPos = ...;.Если вы умнее меня, вы можете даже написать RegEx для него и позволить IDE выполнять свою работу ;-)

Еще один момент заключается в том, что вы можете использовать ключевое слово nameof для события с изменением свойства, если используете C# 6.0 RaisePropertyChanged(nameof(cursorPos));. Это избавит вас от головной боли, если вы однажды переименуете свою собственность.

EDIT

public int cursorPos 
    { 
     get 
     { return position; 
     } 
     set 
     { 
      postion = value; // if you call for example "cursorPos = 12;" the value is "12". this is how properties work... 
      RaisePropertyChanged(nameof(cursorPos)); 
     } 
    } 
+0

Дополнительная информация: http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c – Mat

+0

Спасибо, это было действительно полезно - я hadn ' я понял поля. поближе - все еще не совсем там:/ Я обновил вашу рекомендацию ... и это выглядит довольно хорошо, но все еще не обновляется - в моем классе MainWindow, который передает значение 'cursorPos'val Im, быть в состоянии вызвать 'cursorPos' ..ie' Launcher launcher = new Launcher(); 'затем сменить cursorPos на' launcher.cursorPos = Math.Min (6, launcher.cursorPos + 1' и 'launcher.cursorPos = Math.Min (6, launcher.cursorPos - 1' в настоящее время.Это правильно? –

+0

Я обновил вопрос, чтобы включить новый код ... –

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

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