Я пытаюсь создать простую автономную сборку 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, это неверно, и я должен делать это по-другому?
Событие PropertyChanged только уволен, если присвоить значение в 'cursorPos' собственности. Просто установка поля 'position' не будет работать. – Clemens
Спасибо за быстрый ответ Это то место, где я смотрел (я думал, что обновление cursorPos на множестве сделает это) - как бы я это сделал в этой ситуации? –