Add project files.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
<UserControl x:Class="SafeBagDE70.WelcomeUC"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Top Section -->
|
||||
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0">
|
||||
<Image Source="icon/logo.ico" Width="200" Height="200" Margin="0,10,0,10" Stretch="UniformToFill"/>
|
||||
<TextBlock Text="Xin chào! Hãy lựa chọn hình thức đăng nhập để tiếp tục" FontSize="24" FontWeight="Bold" TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Middle Section -->
|
||||
<Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Button hc:IconElement.Geometry="{StaticResource FullScreenGeometry}" Grid.Column="0" Grid.Row="0" x:Name="btnQRCodeLogin" Content="QR CODE" Width="200" Height="100" Margin="0,0,10,0" FontSize="20" FontWeight="Bold" Click="btnQRCodeLogin_Click"/>
|
||||
<Button Grid.Column="2" Grid.Row="0" x:Name="btnPinCodeLogin" Content="PIN CODE" Width="200" Height="100" Margin="10,0,0,0" Click="PinCodeButton_Click" FontSize="20" FontWeight="Bold"/>
|
||||
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="PinCodePanel">
|
||||
<PasswordBox x:Name="PinCodeBox" Width="300" Height="60" FontSize="20" HorizontalContentAlignment="Center" Margin="0,10,0,0"/>
|
||||
<TextBlock Text="Quên mã PIN?" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" Margin="0,5,0,0" MouseLeftButtonUp="ForgotPin_Click"/>
|
||||
<Button Content="Đăng nhập" Width="200" Height="40" Margin="0,10,0,0" Click="LoginButton_Click"/>
|
||||
<Label x:Name="lblPincodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="QrCodePanel">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="20"/>
|
||||
<hc:LoadingCircle Background="Transparent" VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
<Label x:Name="lblQRcodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<!-- Bottom Section -->
|
||||
<StackPanel Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock Text="TRỢ GIÚP" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" MouseLeftButtonUp="Help_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
||||
Binary file not shown.
@@ -0,0 +1,357 @@
|
||||
using DE70_CMDv2;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SafeBagDE70.Model;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
public static class AppData
|
||||
{
|
||||
public static string CDMPort = "COM4";
|
||||
public static string SensorPort = "COM3";
|
||||
public static Version? CurrentVersion = null;
|
||||
public static List<CustomerAccount>? customerAccounts = null;
|
||||
public static CustomerAccount? CurrentCustomerAccount{get;set;}
|
||||
public static CCmdRsp? cCmdRsp=null;
|
||||
public static bool IsAuthenticated = false;
|
||||
public static bool IsInTransaction = false;
|
||||
public static int WDTCount = 0;
|
||||
public static ObservableCollection<string> logCollection = new ObservableCollection<string>();
|
||||
public static ListView logListView = null;
|
||||
public static int MaxLogCount = 500;
|
||||
public static DeviceStatus? DeviceStatus = null;
|
||||
public static void Init()
|
||||
{
|
||||
|
||||
customerAccounts = new List<CustomerAccount>{
|
||||
new CustomerAccount{Name="NGUYỄN ĐÌNH THUẬN",CustomerId="HUE_0000000001",QRCode="HUE_0000000001",PINCode="H0001" },
|
||||
new CustomerAccount{Name="HOÀNG VĂN HIỆP",CustomerId="HUE_0000000002",QRCode="HUE_0000000002",PINCode="H0002" },
|
||||
new CustomerAccount{Name="PHẠM NGỌC HƯNG",CustomerId="HUE_0000000003",QRCode="HUE_0000000003",PINCode="H0003" },
|
||||
new CustomerAccount{Name="AMHUE-ESTELLETEST",CustomerId="00DZAMHUE0004",QRCode="00DZAMHUE0004",PINCode="H0004" },
|
||||
new CustomerAccount{Name="AMHUE-ECCOTEST",CustomerId="00DZAMHUE0005",QRCode="00DZAMHUE0005",PINCode="H0005" },
|
||||
new CustomerAccount{Name="AMHUE-ALDOTEST",CustomerId="00DZAMHUE0006",QRCode="00DZAMHUE0006",PINCode="H0006" },
|
||||
new CustomerAccount{Name="AMHUE-MLBTEST",CustomerId="00DZAMHUE0007",QRCode="00DZAMHUE0007",PINCode="H0007" },
|
||||
new CustomerAccount{Name="AMHUE-PEDROTEST",CustomerId="00DZAMHUE0008",QRCode="00DZAMHUE0008",PINCode="H0008" }
|
||||
};
|
||||
CurrentCustomerAccount = customerAccounts[0];
|
||||
CDMSTATE=new CDMSTATE();
|
||||
DeviceStatus = new DeviceStatus
|
||||
{
|
||||
Device = Environment.MachineName,
|
||||
TenantId = 0,
|
||||
Status = 0,
|
||||
CDMStatus = 0,
|
||||
PrinterStatus = 0,
|
||||
SensorStatus = 0,
|
||||
Notes = 0,
|
||||
OtherError = 0,
|
||||
};
|
||||
}
|
||||
public static CDMSTATE? CDMSTATE = null;
|
||||
private static DateTime CutOffTime = new DateTime(1, 1, 1, 12, 0, 0); // 12:00 noon as cut-off time
|
||||
|
||||
public static void GetNewTransactionCode()
|
||||
{
|
||||
DateTime transactionDateTime = DateTime.Now;
|
||||
string merchantCode = CurrentCustomerAccount.CustomerId;
|
||||
|
||||
// Adjust transaction date if it's past cut-off time (12:00 noon)
|
||||
DateTime prevadjustedDate = CurrentCustomerAccount.TransactionTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
|
||||
DateTime adjustedDate = transactionDateTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
if ((adjustedDate - prevadjustedDate).Days > 0)
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount =1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount++;
|
||||
}
|
||||
var transactionCount = CurrentCustomerAccount.TransactionCount;
|
||||
string datePart = adjustedDate.ToString("yyyyMMdd");
|
||||
string timePart = transactionDateTime.ToString("HHmmss");
|
||||
string transactionCountPart = transactionCount.ToString("D2"); // Ensure 2 digits
|
||||
|
||||
// Combine all parts to form the transaction ID
|
||||
string transactionId = $"{datePart}{timePart}{merchantCode}{transactionCountPart}";
|
||||
|
||||
CurrentCustomerAccount.TransactionCode = transactionId;
|
||||
CurrentCustomerAccount.TransactionTime = transactionDateTime;
|
||||
}
|
||||
public static CDMSTATE? GetCDMState()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (cCmdRsp != null)
|
||||
{
|
||||
cCmdRsp.SendDeSense();
|
||||
string strSend = cCmdRsp.GetSendDat(false);
|
||||
string strRecv = cCmdRsp.GetRecvDat();
|
||||
Log.Information($"[SEND] {strSend}");
|
||||
Log.Information($"[RECV] {strRecv}");
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
if (AppData.CDMSTATE != null)
|
||||
{
|
||||
AppData.CDMSTATE.IsCassetteFull = data[17] & 0x08;
|
||||
AppData.CDMSTATE.IsNotesInEscrow = data[4] & 0x01;
|
||||
AppData.CDMSTATE.IsRejectPocketFull = data[3] & 0x40;
|
||||
AppData.CDMSTATE.IsNotesInRejectPocket = data[3] & 0x10;
|
||||
AppData.CDMSTATE.IsNotesInHopper = data[3] & 0x01;
|
||||
AppData.CDMSTATE.RequestTime = DateTime.Now;
|
||||
AppData.CDMSTATE.UpdateCDMStatus(cCmdRsp.recv_dat);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return AppData.CDMSTATE;
|
||||
}
|
||||
catch (Exception ex) {
|
||||
Log.Fatal(ex, "GetCDMState");
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public class CustomerAccount
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public string? CustomerId { get; set; }
|
||||
public string? QRCode { get; set; }
|
||||
public string? PINCode { get; set; }
|
||||
public int TransactionCount { get; set; } = 1;
|
||||
public DateTime TransactionTime { get; set; }
|
||||
public string TransactionCode { get; set; }
|
||||
}
|
||||
public class CountSession
|
||||
{
|
||||
public CountSession()
|
||||
{
|
||||
for (int i = 0; i < QuantityDenomi.Count(); i++)
|
||||
{
|
||||
QuantityDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < SumDenomi.Count(); i++)
|
||||
{
|
||||
SumDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < TempNotes.Count(); i++)
|
||||
{
|
||||
TempNotes[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int[] QuantityDenomi { get; set; } = new int[10];
|
||||
public int[] SumDenomi { get; set; } = new int[10];
|
||||
public bool IsStored = false;
|
||||
public int[] TempNotes { get; set; } = new int[5];
|
||||
|
||||
}
|
||||
|
||||
public class CountingData2Send
|
||||
{
|
||||
public string? TransactionCode { get; set; }
|
||||
public List<CountSession>? Sessions { get; set; }
|
||||
public string? UserId { get; set; }
|
||||
public string? MachineId { get; set; }
|
||||
public string? MachineTime { get; set; }
|
||||
public int RejectNotes { get; set; }
|
||||
public int GenuineNotes { get; set; }
|
||||
public int UnfitNotes { get; set; }
|
||||
public int CounterfeitNotes { get; set; }
|
||||
public int SuspendNotes { get; set; }
|
||||
public int CountingState { get; set; }//0-Normal End, 1-Timeout End
|
||||
}
|
||||
|
||||
public class NotesInSession : INotifyPropertyChanged
|
||||
{
|
||||
|
||||
private int _GenuineNotes;
|
||||
public int GenuineNotes
|
||||
{
|
||||
get
|
||||
{
|
||||
return _GenuineNotes;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_GenuineNotes != value)
|
||||
{
|
||||
_GenuineNotes = value;
|
||||
OnPropertyChanged(nameof(GenuineNotes));
|
||||
}
|
||||
}
|
||||
}
|
||||
private int _RejectNotes;
|
||||
public int RejectNotes
|
||||
{
|
||||
get
|
||||
{
|
||||
return _RejectNotes;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_RejectNotes != value)
|
||||
{
|
||||
_RejectNotes = value;
|
||||
OnPropertyChanged(nameof(RejectNotes));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
public class CDMSTATE : INotifyPropertyChanged
|
||||
{
|
||||
public int IsCassetteFull = 0;
|
||||
public int IsNotesInEscrow = 0;
|
||||
public int IsRejectPocketFull = 0;
|
||||
public int IsNotesInRejectPocket = 0;
|
||||
public int IsNotesInHopper = 0;
|
||||
public RecvData? RecvDat = null;
|
||||
public byte GetSR1()
|
||||
{
|
||||
if (RecvDat != null)
|
||||
return RecvDat.dat[0];
|
||||
return 0;
|
||||
}
|
||||
public byte GetSR2()
|
||||
{
|
||||
if (RecvDat != null)
|
||||
return RecvDat.dat[1];
|
||||
return 0;
|
||||
}
|
||||
public byte GetSR3()
|
||||
{
|
||||
if (RecvDat != null)
|
||||
return RecvDat.dat[2];
|
||||
return 0;
|
||||
}
|
||||
public string GetSRStatus()
|
||||
{
|
||||
if (RecvDat != null)
|
||||
return "SR1/2/3: " + AppData.cCmdRsp.GetSR1Summary(RecvDat.dat[0]) + ", " + AppData.cCmdRsp.GetSR2Summary(RecvDat.dat[1]) + ", " + AppData.cCmdRsp.GetSR3Summary(RecvDat.dat[2]);
|
||||
else
|
||||
return "";
|
||||
}
|
||||
public string GetDtatus()
|
||||
{
|
||||
string strStatus = "";
|
||||
if (RecvDat != null)
|
||||
{
|
||||
if(RecvDat.leng>8)
|
||||
{
|
||||
var dat=RecvDat.dat;
|
||||
strStatus += "D1: "+AppData.cCmdRsp.GetD1Summary(dat[3]);
|
||||
strStatus += "\r\nD2: "+AppData.cCmdRsp.GetD2Summary(dat[4]);
|
||||
strStatus += "\r\nD3: " + AppData.cCmdRsp.GetD3Summary(dat[5]);
|
||||
strStatus += "\r\nD4: " + AppData.cCmdRsp.GetD4Summary(dat[6]);
|
||||
strStatus += "\r\nD5: " + AppData.cCmdRsp.GetD5Summary(dat[7]);
|
||||
strStatus += "\r\nD6: " + AppData.cCmdRsp.GetD6Summary(dat[8]);
|
||||
}
|
||||
}
|
||||
return strStatus;
|
||||
}
|
||||
public string GetSStatus()
|
||||
{
|
||||
string strStatus = "";
|
||||
if (RecvDat != null)
|
||||
{
|
||||
if (RecvDat.leng > 18)
|
||||
{
|
||||
var dat = RecvDat.dat;
|
||||
strStatus += "S1: "+ AppData.cCmdRsp.GetD1Summary(dat[17]);
|
||||
strStatus += "\r\nS2: " + AppData.cCmdRsp.GetD2Summary(dat[18]);
|
||||
}
|
||||
}
|
||||
return strStatus;
|
||||
}
|
||||
public string GetFullStatus()
|
||||
{
|
||||
string strStatus = "";
|
||||
strStatus = GetSRStatus();
|
||||
strStatus += "\r\n"+GetDtatus();
|
||||
strStatus += "\r\n"+GetSStatus();
|
||||
return strStatus;
|
||||
}
|
||||
public void UpdateCDMStatus(RecvData recv_data)
|
||||
{
|
||||
RecvDat=recv_data;
|
||||
if (AppData.cCmdRsp != null) {
|
||||
CDMStatus = RequestTime.ToString("yyyy/MM/dd HH:mm:ss ") + GetSRStatus();
|
||||
if (recv_data.leng > 18)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
private string? _CDMStatus;
|
||||
public string? CDMStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CDMStatus;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_CDMStatus != value)
|
||||
{
|
||||
_CDMStatus = value;
|
||||
|
||||
OnPropertyChanged(nameof(CDMStatus));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public DateTime RequestTime = DateTime.Now;
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
public class DeviceStatus
|
||||
{
|
||||
public int TenantId { get; set; }
|
||||
public string Device { get; set; }
|
||||
public int Status { get; set; }
|
||||
public DateTime DeviceTime { get; set; }
|
||||
public int CDMStatus { get; set; }
|
||||
public int PrinterStatus { get; set; }
|
||||
public int SensorStatus { get; set; }
|
||||
public int OtherError { get; set; }
|
||||
public int? Notes { get; set; }
|
||||
public string Description { get; set; }
|
||||
}
|
||||
public enum DeviceStatusCode {
|
||||
NORMAL=0,
|
||||
ERROR=1
|
||||
}
|
||||
public enum PrinterStatusCode
|
||||
{
|
||||
NORMAL = 0,
|
||||
NEARPAPEROUT = 1,
|
||||
PAPEROUT=2
|
||||
}
|
||||
public enum SensorStatusCode
|
||||
{
|
||||
NORMAL = 0,
|
||||
ERROR = 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
<hc:Window x:Class="SafeBagDE70.Admin.AdminWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:SafeBagDE70.Admin"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
ShowInTaskbar="False"
|
||||
ShowNonClientArea="False"
|
||||
Title="AdminWindow" Height="1024" Width="1280">
|
||||
<Grid>
|
||||
<!-- Define Rows and Columns -->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50"/>
|
||||
<!-- Top Bar -->
|
||||
<RowDefinition Height="*"/>
|
||||
<!-- Main Content Area -->
|
||||
<RowDefinition Height="30"/>
|
||||
<!-- Footer -->
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="200"/>
|
||||
<!-- Sidebar -->
|
||||
<ColumnDefinition Width="*"/>
|
||||
<!-- Main Content Area -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Top Bar -->
|
||||
<StackPanel Grid.Row="0" Grid.ColumnSpan="2" Orientation="Horizontal" Background="Gray" Height="50">
|
||||
<TextBlock Text="Admin Panel" VerticalAlignment="Center" Margin="10" Foreground="White" FontSize="20"/>
|
||||
<Button Content="Log Out"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,10,0"
|
||||
Click="LogoutButton_Click"
|
||||
Background="Red"
|
||||
Foreground="White" Width="100"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<StackPanel Grid.Row="1" Grid.Column="0" Background="LightGray" VerticalAlignment="Top">
|
||||
<Button
|
||||
Content="Sự kiện"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="DashboardButton_Click"/>
|
||||
<Button
|
||||
Content="Quản lý vận hành"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="UserManagementButton_Click"/>
|
||||
<Button
|
||||
Content="Thiết lập"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="SettingsButton_Click"/>
|
||||
<Button
|
||||
Content="Cấu hình"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Padding="10"
|
||||
Click="ConfigurationButton_Click"/>
|
||||
<Button
|
||||
Content="Báo cáo"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Padding="10"
|
||||
Click="ReportsButton_Click"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Main Content Area -->
|
||||
<ContentControl Grid.Row="1" Grid.Column="1" x:Name="MainContentControl" Margin="10"/>
|
||||
|
||||
<!-- Footer -->
|
||||
<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Orientation="Horizontal" Background="Gray" Height="30">
|
||||
<TextBlock Text="Admin Panel - Version 1.0" VerticalAlignment="Center" Margin="10" Foreground="White"/>
|
||||
<TextBlock Text="Status: Connected" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,10,0" Foreground="Green"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</hc:Window>
|
||||
Reference in New Issue
Block a user