2016-09-27 73 views
1

我正在嘗試製作一個簡單的Unity Standalone構建啓動器(用於街機內閣) - 安裝程序非常簡單 - 操縱桿向上和向下突出顯示一個遊戲(在這種情況下,更改一個遊戲的填充顏色矩形和BUTTON1 lauches正確的遊戲。 我傻傻的以爲我可以簡單地在WPF做到這一點,但在第一道關卡都有所涉獵。wpf DataTrigger值不更新

我有鍵盤輸入(街機搖桿是建立通過I-PAC2)工作(焦點鎖定在主窗口上),並且正在改變一個從0到6的整數,這可以通過MainWindow上的代碼工作(hurray)並傳遞到一個叫做的靜態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> 

和啓動類...

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晚沒有運氣嘗試修訂)。我真的很感謝一些新來的人。

謝謝, 彼得

更新 我基於下面的反饋更新啓動...

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。我現在唯一能想到的是通過實例化在MainWindow中調用的Launcher類是不正確的,我應該以另一種方式做它?

+1

如果您分配一個值'cursorPos'屬性的PropertyChanged事件僅觸發。只需設置「位置」字段將不起作用。 – Clemens

+0

感謝您的快速回復 這是我在看的地方(我曾想過更新集合上的cursorPos會這樣做) - 在這種情況下我該怎麼做? –

回答

0

總的來說這是一個好主意,使你的領域專用,並給予了性能訪問:

public static int position = 0; 

應該

private /*static*/ int position = 0; 

我評論的靜態,因爲如果這是你應該只使用它真的需要。

全部替換position = ...;cursorPos = ...;。如果你比我聰明,你甚至可以爲它編寫一個正則表達式,讓IDE做你的工作;-)

的另一點是,你可以,如果你使用C#6.0 RaisePropertyChanged(nameof(cursorPos));使用屬性更改事件的nameof關鍵字。如果你有一天重新命名你的房產,這會讓你更加頭痛。

編輯

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

謝謝,這真的很有幫助 - 我沒有'對這些領域非常瞭解。 越來越近 - 仍然不是那裏:/ 我已經更新到您的建議...並且它看起來很不錯,但仍然沒有更新 - 在我的MainWindow類中,發出'cursorPos'value Im實例化類到能夠調用'cursorPos' ..ie'Launcher launcher = new Launcher();'然後通過'launcher.cursorPos = Math.Min(6,launcher.cursorPos + 1'和'launcher.cursorPos = Math.Min (6,launcher.cursorPos - 1',這是正確的嗎? –

+0

我已經更新了問題以包含新代碼... –