COM Port / Kartenleserfunktionen neu gemacht
This commit is contained in:
parent
8544d5c30a
commit
62b2dca396
@ -6,7 +6,7 @@
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns:local="clr-namespace:ZKuP"
|
||||
mc:Ignorable="d"
|
||||
Title="Kartenbenutzer" MinHeight="450" Height="450" Width="594" Loaded="Window_Loaded" LocationChanged="Window_LocationChanged">
|
||||
Title="Kartenbenutzer" MinHeight="450" Height="450" Width="594" Loaded="Window_Loaded" Closing="MetroWindow_Closing" LocationChanged="Window_LocationChanged">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
|
||||
@ -14,6 +14,7 @@ using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
|
||||
namespace ZKuP
|
||||
{
|
||||
@ -38,6 +39,8 @@ namespace ZKuP
|
||||
|
||||
DispatcherTimer blinkTimer = new DispatcherTimer();
|
||||
|
||||
private CardReaderViewModel _cardReader;
|
||||
|
||||
public AddCardUser(string user = "", bool isBesucher = false, string count = "", string ap = "", bool needTel = true, bool hasEinweisung = false, string firma = "", string telnr = "", string idFirma = "")
|
||||
{
|
||||
_user = user;
|
||||
@ -47,8 +50,9 @@ namespace ZKuP
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
Helper.InitSerial();
|
||||
Helper.DataReceived += Helper_DataReceived;
|
||||
_cardReader = new CardReaderViewModel();
|
||||
_cardReader.CardDetected += OnCardDetected;
|
||||
_cardReader.StartListening(Settings.GetSettingString("COMPort"));
|
||||
|
||||
blinkTimer.Interval = TimeSpan.FromMilliseconds(50);
|
||||
blinkTimer.Tick += BlinkTimer_Tick;
|
||||
@ -125,13 +129,13 @@ namespace ZKuP
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void Helper_DataReceived(object sender, string e)
|
||||
private void OnCardDetected(string cardNumber)
|
||||
{
|
||||
// Deine Logik
|
||||
var text = "";
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
text = tbNummer.Text = e.Split('=')[0];
|
||||
text = tbNummer.Text = cardNumber.Split('=')[0];
|
||||
|
||||
borderKartenleser.Visibility = Visibility.Collapsed;
|
||||
|
||||
@ -154,6 +158,34 @@ namespace ZKuP
|
||||
}
|
||||
});
|
||||
}
|
||||
//private void Helper_DataReceived(object sender, string e)
|
||||
//{
|
||||
// var text = "";
|
||||
// Dispatcher.Invoke(() =>
|
||||
// {
|
||||
// text = tbNummer.Text = e.Split('=')[0];
|
||||
|
||||
// borderKartenleser.Visibility = Visibility.Collapsed;
|
||||
|
||||
|
||||
// blinkTimer.Stop();
|
||||
|
||||
// if (!string.IsNullOrWhiteSpace(text))
|
||||
// {
|
||||
// var farbe = SQL.ReadSingleValue($"SELECT Farbe FROM {MainWindow.table}.kartennummern WHERE Kartennummer='{text}'");
|
||||
|
||||
// switch (farbe)
|
||||
// {
|
||||
// case "1":
|
||||
// cbColor.SelectedValue = "Rot";
|
||||
// break;
|
||||
// case "2":
|
||||
// cbColor.SelectedValue = "Grün";
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
//}
|
||||
|
||||
|
||||
private void tbNummer_TextChanged(object sender, TextChangedEventArgs e)
|
||||
@ -255,5 +287,10 @@ namespace ZKuP
|
||||
{
|
||||
Helper.CheckWindowIsInScreenSpace(this);
|
||||
}
|
||||
|
||||
private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
_cardReader.StopListening();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,12 +24,14 @@ namespace ZKuP
|
||||
{
|
||||
private List<string> COMList = new List<string>();
|
||||
|
||||
private CardReaderViewModel _cardReader;
|
||||
public COMSelector()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
COMList = Helper.GetCOMPorts();
|
||||
cbCOMList.ItemsSource = COMList;
|
||||
|
||||
}
|
||||
|
||||
private void btnSave_Click(object sender, RoutedEventArgs e)
|
||||
@ -46,19 +48,25 @@ namespace ZKuP
|
||||
|
||||
private void cbCOMList_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
Helper.DataReceived += Helper_DataReceived;
|
||||
var match = Regex.Match(cbCOMList.SelectedValue.ToString(), @"COM\d+(?=\))");
|
||||
Settings.WriteSetting("COMPort", match.Value);
|
||||
|
||||
_cardReader = new CardReaderViewModel();
|
||||
_cardReader.CardDetected += OnCardDetected;
|
||||
_cardReader.StartListening(Settings.GetSettingString("COMPort"));
|
||||
//Helper.DataReceived += Helper_DataReceived;
|
||||
MessageBox.Show("Bitte jetzt den Leser testen:\n\nSchließen Sie diese Meldung und legen Sie anschließend eine Karte auf!\n\nWird nach dem Auflegen keine Meldung angezeigt, bitte anderen Port wählen", "Kartenleser testen", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
Helper.InitSerial(cbCOMList.SelectedValue.ToString());
|
||||
//Helper.InitSerial(cbCOMList.SelectedValue.ToString(), true);
|
||||
}
|
||||
|
||||
private void Helper_DataReceived(object sender, string e)
|
||||
private void OnCardDetected(string cardNumber)
|
||||
{
|
||||
if (e.Split('=')[0].Length == 19)
|
||||
if (cardNumber.Split('=')[0].Length == 19)
|
||||
{
|
||||
MessageBox.Show("Test des Kartenlesers erfolgreich!", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
|
||||
Helper.DataReceived -= Helper_DataReceived;
|
||||
}
|
||||
|
||||
_cardReader.StopListening();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
71
ZKuP/CardReaderViewModel.cs
Normal file
71
ZKuP/CardReaderViewModel.cs
Normal file
@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.IO.Ports;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
|
||||
public class CardReaderViewModel : IDisposable
|
||||
{
|
||||
private SerialPort _port;
|
||||
private StringBuilder _buffer = new StringBuilder();
|
||||
|
||||
public event Action<string> CardDetected;
|
||||
|
||||
public void StartListening(string portName = "COM3")
|
||||
{
|
||||
if (_port != null && _port.IsOpen)
|
||||
return; // Bereits aktiv
|
||||
|
||||
_port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
|
||||
_port.DataReceived += OnDataReceived;
|
||||
|
||||
try
|
||||
{
|
||||
_port.Open();
|
||||
}
|
||||
catch (UnauthorizedAccessException)
|
||||
{
|
||||
// Port bereits von anderem Fenster geöffnet
|
||||
throw new InvalidOperationException("Port ist bereits in Verwendung");
|
||||
}
|
||||
}
|
||||
|
||||
public void StopListening()
|
||||
{
|
||||
if (_port != null && _port.IsOpen)
|
||||
{
|
||||
//_port.DataReceived -= OnDataReceived;
|
||||
//_port.Dispose();
|
||||
_port.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||
{
|
||||
string data = _port.ReadExisting();
|
||||
_buffer.Append(data);
|
||||
|
||||
string bufferContent = _buffer.ToString();
|
||||
int newlineIndex = bufferContent.IndexOfAny(new[] { '\r', '\n' });
|
||||
|
||||
if (newlineIndex >= 0)
|
||||
{
|
||||
string cardNumber = bufferContent.Substring(0, newlineIndex).Trim();
|
||||
_buffer.Clear();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(cardNumber))
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
CardDetected?.Invoke(cardNumber);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
StopListening();
|
||||
_port?.Dispose();
|
||||
}
|
||||
}
|
||||
@ -437,6 +437,8 @@ namespace ZKuP
|
||||
if (type == CardType.McFit || type == CardType.All) mcFit = SQL.ReadSQL($"SELECT `Kartennr`,`Vorname`,`Nachname`,`Abteilung`,`Handynr`,`Email`,`AusgabeTimestamp`,`ZurueckTimestamp`,`AktuellAusgegeben` FROM {MainWindow.table}.mcFit ORDER BY AusgabeTimestamp", mcFit).Result;
|
||||
});
|
||||
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (type == CardType.DB || type == CardType.All)
|
||||
{
|
||||
if (!karten.Columns.Contains("IsChecked"))
|
||||
@ -445,6 +447,7 @@ namespace ZKuP
|
||||
dgCards.DataContext = karten;
|
||||
}
|
||||
if (type == CardType.McFit || type == CardType.All) dgMcFit.DataContext = mcFit;
|
||||
});
|
||||
}
|
||||
|
||||
private void Window_LocationChanged(object sender, EventArgs e)
|
||||
|
||||
140
ZKuP/Helper.cs
140
ZKuP/Helper.cs
@ -876,49 +876,55 @@ namespace ZKuP
|
||||
}
|
||||
}
|
||||
|
||||
public static SerialPort serial = new SerialPort();
|
||||
//public static SerialPort serial = new SerialPort();
|
||||
//static bool serialInitialized = false;
|
||||
//public static void InitSerial(string COM = "", bool forced = false)
|
||||
//{
|
||||
// if (!serialInitialized || forced)
|
||||
// {
|
||||
// if (COM == "" && string.IsNullOrWhiteSpace(Settings.GetSettingString("COMPort")) && GetCOMPortCount() > 0)
|
||||
// {
|
||||
// COMSelector cOMSelector = new COMSelector();
|
||||
// cOMSelector.ShowDialog();
|
||||
// }
|
||||
// else if (COM != "")
|
||||
// {
|
||||
// var match = Regex.Match(COM, @"COM\d+(?=\))");
|
||||
// Settings.WriteSetting("COMPort", match.Value);
|
||||
// }
|
||||
|
||||
public static void InitSerial(string COM = "")
|
||||
{
|
||||
if (COM == "" && string.IsNullOrWhiteSpace(Settings.GetSettingString("COMPort")) && GetCOMPortCount() > 0)
|
||||
{
|
||||
COMSelector cOMSelector = new COMSelector();
|
||||
cOMSelector.ShowDialog();
|
||||
}
|
||||
else if(COM != "")
|
||||
{
|
||||
var match = Regex.Match(COM, @"COM\d+(?=\))");
|
||||
Settings.WriteSetting("COMPort", match.Value);
|
||||
}
|
||||
// if (forced && serial.IsOpen) { serial.Close(); }
|
||||
|
||||
if (!serial.IsOpen)
|
||||
{
|
||||
try
|
||||
{
|
||||
var port = Settings.GetSettingString("COMPort");
|
||||
if (!string.IsNullOrWhiteSpace(port))
|
||||
{
|
||||
serial.PortName = port; //Com Port Name
|
||||
serial.BaudRate = Convert.ToInt32(9600); //COM Port Sp
|
||||
serial.Handshake = System.IO.Ports.Handshake.None;
|
||||
serial.Parity = Parity.None;
|
||||
serial.DataBits = 8;
|
||||
serial.StopBits = StopBits.One;
|
||||
serial.ReadTimeout = 200;
|
||||
serial.WriteTimeout = 50;
|
||||
// if (!serial.IsOpen)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// var port = Settings.GetSettingString("COMPort");
|
||||
// if (!string.IsNullOrWhiteSpace(port))
|
||||
// {
|
||||
// serial.PortName = port; //Com Port Name
|
||||
// serial.BaudRate = Convert.ToInt32(9600); //COM Port Sp
|
||||
// serial.Handshake = System.IO.Ports.Handshake.None;
|
||||
// serial.Parity = Parity.None;
|
||||
// serial.DataBits = 8;
|
||||
// serial.StopBits = StopBits.One;
|
||||
// serial.ReadTimeout = 200;
|
||||
// serial.WriteTimeout = 50;
|
||||
|
||||
serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(OnDataReceived);
|
||||
serial.Open();
|
||||
}
|
||||
// serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(OnDataReceived);
|
||||
// serial.Open();
|
||||
// }
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// MessageBox.Show("Fehler beim Öffnen des COM Ports\nKartenleser kann nicht aktiviert werden\n\nBitte Kartenleser anstecken oder anderen COM Port versuchen", "Fehler beim COM Port", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
// Log.WriteLog(ex.ToString());
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show("Fehler beim Öffnen des COM Ports\nKartenleser kann nicht aktiviert werden\n\nBitte Kartenleser anstecken oder anderen COM Port versuchen", "Fehler beim COM Port", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
Log.WriteLog(ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
// serialInitialized = true;
|
||||
// }
|
||||
//}
|
||||
|
||||
public static int GetCOMPortCount()
|
||||
{
|
||||
@ -958,35 +964,35 @@ namespace ZKuP
|
||||
// return Recieve();
|
||||
//}
|
||||
|
||||
public static event EventHandler<string> DataReceived;
|
||||
public static event EventHandler<byte[]> BinaryDataReceived;
|
||||
private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (serial.BytesToRead > 0)
|
||||
{
|
||||
// Read as string
|
||||
string stringData = serial.ReadExisting();
|
||||
if (!string.IsNullOrWhiteSpace(stringData))
|
||||
{
|
||||
DataReceived?.Invoke(sender, stringData);
|
||||
}
|
||||
//public static event EventHandler<string> DataReceived;
|
||||
//public static event EventHandler<byte[]> BinaryDataReceived;
|
||||
//private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// if (serial.BytesToRead > 0)
|
||||
// {
|
||||
// // Read as string
|
||||
// string stringData = serial.ReadExisting();
|
||||
// if (!string.IsNullOrWhiteSpace(stringData))
|
||||
// {
|
||||
// DataReceived?.Invoke(sender, stringData);
|
||||
// }
|
||||
|
||||
// For binary data reception
|
||||
if (serial.BytesToRead > 0)
|
||||
{
|
||||
byte[] binaryData = new byte[serial.BytesToRead];
|
||||
serial.Read(binaryData, 0, binaryData.Length);
|
||||
BinaryDataReceived?.Invoke(sender, binaryData);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error in async data reception: {ex.Message}");
|
||||
}
|
||||
}
|
||||
// // For binary data reception
|
||||
// if (serial.BytesToRead > 0)
|
||||
// {
|
||||
// byte[] binaryData = new byte[serial.BytesToRead];
|
||||
// serial.Read(binaryData, 0, binaryData.Length);
|
||||
// BinaryDataReceived?.Invoke(sender, binaryData);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Log.WriteLog($"Error in async data reception: {ex.Message}");
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
public static string GetIPAddresses()
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns:local="clr-namespace:ZKuP"
|
||||
mc:Ignorable="d"
|
||||
Title="Rote Karte zu Grüner Karte tauschen" Height="250" Width="400" Loaded="Window_Loaded" LocationChanged="Window_LocationChanged">
|
||||
Title="Rote Karte zu Grüner Karte tauschen" Height="250" Width="400" Loaded="Window_Loaded" Closing="MetroWindow_Closing" LocationChanged="Window_LocationChanged">
|
||||
<Grid Margin="10">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="1.5*"/>
|
||||
|
||||
@ -23,6 +23,7 @@ namespace ZKuP
|
||||
public partial class KartenTausch : MetroWindow
|
||||
{
|
||||
DispatcherTimer blinkTimer = new DispatcherTimer();
|
||||
private CardReaderViewModel _cardReader;
|
||||
|
||||
public KartenTausch()
|
||||
{
|
||||
@ -30,8 +31,12 @@ namespace ZKuP
|
||||
|
||||
cbRot.ItemsSource = SQL.ReadListString($"SELECT kartennr From {MainWindow.table}.karten WHERE farbe = 'Rot'").Result;
|
||||
|
||||
Helper.InitSerial();
|
||||
Helper.DataReceived += Helper_DataReceived;
|
||||
|
||||
_cardReader = new CardReaderViewModel();
|
||||
_cardReader.CardDetected += OnCardDetected;
|
||||
_cardReader.StartListening(Settings.GetSettingString("COMPort"));
|
||||
//Helper.InitSerial();
|
||||
//Helper.DataReceived += Helper_DataReceived;
|
||||
|
||||
blinkTimer.Interval = TimeSpan.FromMilliseconds(50);
|
||||
blinkTimer.Tick += BlinkTimer_Tick;
|
||||
@ -70,22 +75,36 @@ namespace ZKuP
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void Helper_DataReceived(object sender, string e)
|
||||
private void OnCardDetected(string cardNumber)
|
||||
{
|
||||
// Deine Logik
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
borderKartenleserRot.Visibility = Visibility.Collapsed;
|
||||
blinkTimer.Stop();
|
||||
|
||||
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (cbRot.ItemsSource.Cast<string>().ToList().Contains(e.Split('=')[0].ToString()))
|
||||
cbRot.SelectedValue = e.Split('=')[0].ToString();
|
||||
if (cbRot.ItemsSource.Cast<string>().ToList().Contains(cardNumber.Split('=')[0].ToString()))
|
||||
cbRot.SelectedValue = cardNumber.Split('=')[0].ToString();
|
||||
else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused)
|
||||
tbGruen.Text = e.Split('=')[0].ToString();
|
||||
|
||||
tbGruen.Text = cardNumber.Split('=')[0].ToString();
|
||||
});
|
||||
}
|
||||
//private void Helper_DataReceived(object sender, string e)
|
||||
//{
|
||||
// Dispatcher.Invoke(() =>
|
||||
// {
|
||||
// borderKartenleserRot.Visibility = Visibility.Collapsed;
|
||||
// blinkTimer.Stop();
|
||||
|
||||
|
||||
// if (cbRot.ItemsSource.Cast<string>().ToList().Contains(e.Split('=')[0].ToString()))
|
||||
// cbRot.SelectedValue = e.Split('=')[0].ToString();
|
||||
// else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused)
|
||||
// tbGruen.Text = e.Split('=')[0].ToString();
|
||||
|
||||
// });
|
||||
//}
|
||||
|
||||
bool up = false;
|
||||
private void BlinkTimer_Tick(object sender, EventArgs e)
|
||||
@ -197,5 +216,9 @@ namespace ZKuP
|
||||
Helper.CheckWindowIsInScreenSpace(this);
|
||||
}
|
||||
|
||||
private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
_cardReader.StopListening();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,7 +44,7 @@ namespace ZKuP
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
public const string Version = "5.2.1.0";
|
||||
public const string Version = "5.2.1.2";
|
||||
//public static Roles LoggedInRole { get; private set; } = Roles.None;
|
||||
internal static MainWindow main;
|
||||
ThemeManager TM;
|
||||
@ -239,8 +239,7 @@ namespace ZKuP
|
||||
File.Copy(@"\\mhb00swfs003v.fv-werke.db.de\GLW99\ZKuP\ZKuPUpdater.exe", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ZKuPUpdater.exe", true);
|
||||
|
||||
System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ZKuPUpdater.exe", $"\"{file}\"");
|
||||
Helper.serial.Close();
|
||||
Helper.serial.Dispose();
|
||||
|
||||
Application.Current.Shutdown();
|
||||
return;
|
||||
}
|
||||
@ -2858,18 +2857,17 @@ namespace ZKuP
|
||||
else
|
||||
lblmcfit.Visibility = Visibility.Collapsed;
|
||||
|
||||
if (tabPfoertner.IsSelected)
|
||||
{
|
||||
if (Helper.GetCOMPortCount() > 1)
|
||||
btnCOMSelector.Visibility = Visibility.Visible;
|
||||
else if (Helper.GetCOMPortCount() == 1)
|
||||
Settings.WriteSetting("COMPort", Regex.Match(Helper.GetCOMPorts().First(), @"COM\d+(?=\))").Value);
|
||||
//if (tabPfoertner.IsSelected)
|
||||
//{
|
||||
// //if (Helper.GetCOMPortCount() > 1)
|
||||
// // btnCOMSelector.Visibility = Visibility.Visible;
|
||||
// //else if (Helper.GetCOMPortCount() == 1)
|
||||
// // Settings.WriteSetting("COMPort", Regex.Match(Helper.GetCOMPorts().First(), @"COM\d+(?=\))").Value);
|
||||
|
||||
if (Helper.GetCOMPortCount() == 0)
|
||||
return;
|
||||
// //if (Helper.GetCOMPortCount() == 0)
|
||||
// // return;
|
||||
|
||||
Helper.InitSerial();
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
private void imgLoading_AnimationCompleted(DependencyObject d, XamlAnimatedGif.AnimationCompletedEventArgs e)
|
||||
|
||||
@ -233,6 +233,7 @@
|
||||
<Compile Include="Belegung.xaml.cs">
|
||||
<DependentUpon>Belegung.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CardReaderViewModel.cs" />
|
||||
<Compile Include="Cards.xaml.cs">
|
||||
<DependentUpon>Cards.xaml</DependentUpon>
|
||||
</Compile>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user