我正在嘗試製作一個簡單的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類是不正確的,我應該以另一種方式做它?
如果您分配一個值'cursorPos'屬性的PropertyChanged事件僅觸發。只需設置「位置」字段將不起作用。 – Clemens
感謝您的快速回復 這是我在看的地方(我曾想過更新集合上的cursorPos會這樣做) - 在這種情況下我該怎麼做? –