Wave 1: Complete PKMEditor tabs + user refinements

Main tab: shiny toggle, PID reroll, nicknamed flag, Stat Nature,
Form ComboBox, Pokérus, friendship/hatch label swap, legality icon.
Met tab: fateful encounter, battle version, obedience level.
Stats tab: EV total, hyper training, Dynamax, Gigantamax, Alpha, Tera.
Moves tab: PP display, PP Ups, relearn moves.
Cosmetic tab: size/scale controls.
OT/Misc tab: OT/HT gender, handler, EC reroll, Home Tracker.
Includes user refinements to menu structure, SAV tab layout, slot
context menu code-behind, and control styling.
This commit is contained in:
montanon 2026-03-15 23:22:37 -03:00
parent 5552be293f
commit 475fb816d3
2 changed files with 329 additions and 49 deletions

View File

@ -3,6 +3,7 @@
using System.Linq;
using Avalonia.Media.Imaging;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using PKHeX.Avalonia.Converters;
using PKHeX.Core;
using PKHeX.Drawing.PokeSprite.Avalonia;
@ -138,6 +139,86 @@ public partial class PKMEditorViewModel : ObservableObject
[ObservableProperty] private ushort _tid;
[ObservableProperty] private ushort _sid;
// OT Gender
[ObservableProperty] private byte _otGender;
public string OtGenderSymbol => OtGender switch
{
0 => "\u2642", // ♂
1 => "\u2640", // ♀
_ => "\u2014", // —
};
partial void OnOtGenderChanged(byte value)
{
OnPropertyChanged(nameof(OtGenderSymbol));
}
[RelayCommand]
private void ToggleOtGender()
{
OtGender = (byte)(OtGender == 0 ? 1 : 0);
}
// Handling Trainer
[ObservableProperty] private int _currentHandler;
[ObservableProperty] private string _handlingTrainerName = string.Empty;
[ObservableProperty] private byte _htGender;
public string HtGenderSymbol => HtGender switch
{
0 => "\u2642", // ♂
1 => "\u2640", // ♀
_ => "\u2014", // —
};
partial void OnHtGenderChanged(byte value)
{
OnPropertyChanged(nameof(HtGenderSymbol));
}
[ObservableProperty] private bool _hasHandler;
// Encryption Constant
[ObservableProperty] private string _encryptionConstantHex = "00000000";
[RelayCommand]
private void RerollEc()
{
var rng = new Random();
var ec = (uint)rng.Next();
EncryptionConstantHex = ec.ToString("X8");
}
// Home Tracker
[ObservableProperty] private string _homeTrackerHex = "0000000000000000";
[ObservableProperty] private bool _hasHomeTracker;
// Met — Fateful Encounter
[ObservableProperty] private bool _fatefulEncounter;
// Met — Obedience Level (Gen 9)
[ObservableProperty] private byte _obedienceLevel;
[ObservableProperty] private bool _hasObedienceLevel;
// Met — Battle Version (Gen 8+)
[ObservableProperty] private int _battleVersion;
[ObservableProperty] private bool _hasBattleVersion;
[ObservableProperty] private ComboItem? _selectedBattleVersion;
partial void OnSelectedBattleVersionChanged(ComboItem? value)
{
if (value is not null)
BattleVersion = value.Value;
}
// Cosmetic — Size/Scale
[ObservableProperty] private int _heightScalar;
[ObservableProperty] private int _weightScalar;
[ObservableProperty] private int _scale;
[ObservableProperty] private bool _hasSizeData;
[ObservableProperty] private bool _hasScale;
[ObservableProperty]
private bool _isInitialized;
@ -351,6 +432,57 @@ public void PopulateFields(PKM pk)
Tid = pk.TID16;
Sid = pk.SID16;
// OT Gender
OtGender = pk.OriginalTrainerGender;
// Handling Trainer
CurrentHandler = pk.CurrentHandler;
HandlingTrainerName = pk.HandlingTrainerName;
HtGender = pk.HandlingTrainerGender;
HasHandler = !string.IsNullOrEmpty(pk.HandlingTrainerName);
// Encryption Constant
EncryptionConstantHex = pk.EncryptionConstant.ToString("X8");
// Home Tracker
if (pk is IHomeTrack ht)
{
HasHomeTracker = true;
HomeTrackerHex = ht.Tracker.ToString("X16");
}
else
{
HasHomeTracker = false;
HomeTrackerHex = "0000000000000000";
}
// Met — Fateful Encounter
FatefulEncounter = pk.FatefulEncounter;
// Met — Obedience Level
if (pk is IObedienceLevel ol)
{
HasObedienceLevel = true;
ObedienceLevel = ol.ObedienceLevel;
}
else
{
HasObedienceLevel = false;
ObedienceLevel = 0;
}
// Met — Battle Version
if (pk is IBattleVersion bv)
{
HasBattleVersion = true;
BattleVersion = (int)bv.BattleVersion;
}
else
{
HasBattleVersion = false;
BattleVersion = 0;
}
// Cosmetic — Markings
if (pk is IAppliedMarkings7 m7)
{
@ -417,6 +549,32 @@ public void PopulateFields(PKM pk)
IsFavorite = false;
}
// Cosmetic — Size/Scale
if (pk is IScaledSize ss)
{
HasSizeData = true;
HeightScalar = ss.HeightScalar;
WeightScalar = ss.WeightScalar;
if (pk is IScaledSize3 ss3)
{
HasScale = true;
Scale = ss3.Scale;
}
else
{
HasScale = false;
Scale = 0;
}
}
else
{
HasSizeData = false;
HasScale = false;
HeightScalar = 0;
WeightScalar = 0;
Scale = 0;
}
// Refresh location lists based on version/context before setting selected items
RefreshLocationLists();
@ -435,6 +593,9 @@ public void PopulateFields(PKM pk)
SelectedMetLocation = MetLocationList.FirstOrDefault(x => x.Value == pk.MetLocation);
SelectedEggLocation = EggLocationList.FirstOrDefault(x => x.Value == pk.EggLocation);
if (pk is IBattleVersion)
SelectedBattleVersion = VersionList.FirstOrDefault(x => x.Value == BattleVersion);
UpdateSprite();
}
@ -487,6 +648,22 @@ public void PopulateFields(PKM pk)
Entity.IsEgg = IsEgg;
// OT Gender
Entity.OriginalTrainerGender = OtGender;
// Handling Trainer
Entity.CurrentHandler = (byte)CurrentHandler;
Entity.HandlingTrainerName = HandlingTrainerName;
Entity.HandlingTrainerGender = HtGender;
// Encryption Constant
if (uint.TryParse(EncryptionConstantHex, System.Globalization.NumberStyles.HexNumber, null, out var ec))
Entity.EncryptionConstant = ec;
// Home Tracker
if (Entity is IHomeTrack htSave && ulong.TryParse(HomeTrackerHex, System.Globalization.NumberStyles.HexNumber, null, out var tracker))
htSave.Tracker = tracker;
// Cosmetic — Markings
if (Entity is IAppliedMarkings7 m7)
{
@ -542,6 +719,26 @@ public void PopulateFields(PKM pk)
Entity.EggMonth = (byte)Math.Clamp(EggMonth, 0, 12);
Entity.EggDay = (byte)Math.Clamp(EggDay, 0, 31);
// Met — Fateful Encounter
Entity.FatefulEncounter = FatefulEncounter;
// Met — Obedience Level
if (Entity is IObedienceLevel olSave)
olSave.ObedienceLevel = ObedienceLevel;
// Met — Battle Version
if (Entity is IBattleVersion bvSave)
bvSave.BattleVersion = (GameVersion)BattleVersion;
// Cosmetic — Size/Scale
if (Entity is IScaledSize ssSave)
{
ssSave.HeightScalar = (byte)Math.Clamp(HeightScalar, 0, 255);
ssSave.WeightScalar = (byte)Math.Clamp(WeightScalar, 0, 255);
if (Entity is IScaledSize3 ss3Save)
ss3Save.Scale = (byte)Math.Clamp(Scale, 0, 255);
}
return Entity;
}

View File

@ -100,53 +100,71 @@
<TextBlock Text="Met" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<Grid Margin="4,2,4,2"
RowDefinitions="27,27,27,27,27,27,27,27"
ColumnDefinitions="104,*">
<!-- Origin Game -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Origin Game:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding VersionList}" SelectedItem="{Binding SelectedVersion}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid Margin="4,2,4,2"
RowDefinitions="27,27,27,27,27,27,27,27,27,27"
ColumnDefinitions="104,*">
<!-- Origin Game -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Origin Game:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding VersionList}" SelectedItem="{Binding SelectedVersion}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Met Location -->
<TextBlock Grid.Row="1" Grid.Column="0" Text="Met Location:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MetLocationList}" SelectedItem="{Binding SelectedMetLocation}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Met Location -->
<TextBlock Grid.Row="1" Grid.Column="0" Text="Met Location:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MetLocationList}" SelectedItem="{Binding SelectedMetLocation}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Ball -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="Ball:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding BallList}" SelectedItem="{Binding SelectedBall}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Ball -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="Ball:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding BallList}" SelectedItem="{Binding SelectedBall}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Met Level -->
<TextBlock Grid.Row="3" Grid.Column="0" Text="Met Level:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="3" Grid.Column="1" Value="{Binding MetLevel}" Minimum="0" Maximum="100" Height="25" Width="60" HorizontalAlignment="Left" />
<!-- Met Level + Fateful Encounter -->
<TextBlock Grid.Row="3" Grid.Column="0" Text="Met Level:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="3" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Spacing="8">
<NumericUpDown Value="{Binding MetLevel}" Minimum="0" Maximum="100" Height="25" Width="60" />
<CheckBox IsChecked="{Binding FatefulEncounter}" Content="Fateful" VerticalAlignment="Center" />
</StackPanel>
<!-- Met Date -->
<TextBlock Grid.Row="4" Grid.Column="0" Text="Met Date:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="4" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Spacing="4">
<NumericUpDown Value="{Binding MetYear}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding MetMonth}" Minimum="0" Maximum="12" Height="25" Width="52" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding MetDay}" Minimum="0" Maximum="31" Height="25" Width="52" />
</StackPanel>
<!-- Met Date -->
<TextBlock Grid.Row="4" Grid.Column="0" Text="Met Date:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="4" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Spacing="4">
<NumericUpDown Value="{Binding MetYear}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding MetMonth}" Minimum="0" Maximum="12" Height="25" Width="52" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding MetDay}" Minimum="0" Maximum="31" Height="25" Width="52" />
</StackPanel>
<!-- Egg Location -->
<TextBlock Grid.Row="5" Grid.Column="0" Text="Egg Location:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="5" Grid.Column="1" ItemsSource="{Binding EggLocationList}" SelectedItem="{Binding SelectedEggLocation}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Egg Location -->
<TextBlock Grid.Row="5" Grid.Column="0" Text="Egg Location:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="5" Grid.Column="1" ItemsSource="{Binding EggLocationList}" SelectedItem="{Binding SelectedEggLocation}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<!-- Egg Met Date -->
<TextBlock Grid.Row="6" Grid.Column="0" Text="Egg Met Date:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="6" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Spacing="4">
<NumericUpDown Value="{Binding EggYear}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding EggMonth}" Minimum="0" Maximum="12" Height="25" Width="52" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding EggDay}" Minimum="0" Maximum="31" Height="25" Width="52" />
</StackPanel>
</Grid>
<!-- Egg Met Date -->
<TextBlock Grid.Row="6" Grid.Column="0" Text="Egg Met Date:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="6" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Spacing="4">
<NumericUpDown Value="{Binding EggYear}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding EggMonth}" Minimum="0" Maximum="12" Height="25" Width="52" />
<TextBlock Text="/" VerticalAlignment="Center" />
<NumericUpDown Value="{Binding EggDay}" Minimum="0" Maximum="31" Height="25" Width="52" />
</StackPanel>
<!-- Battle Version (visible when HasBattleVersion) -->
<TextBlock Grid.Row="7" Grid.Column="0" Text="Battle Ver:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasBattleVersion}" />
<ComboBox Grid.Row="7" Grid.Column="1" ItemsSource="{Binding VersionList}" SelectedItem="{Binding SelectedBattleVersion}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left"
IsVisible="{Binding HasBattleVersion}" />
<!-- Obedience Level (visible when HasObedienceLevel) -->
<TextBlock Grid.Row="8" Grid.Column="0" Text="Obedience Lv:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasObedienceLevel}" />
<NumericUpDown Grid.Row="8" Grid.Column="1" Value="{Binding ObedienceLevel}" Minimum="0" Maximum="100" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasObedienceLevel}" />
</Grid>
</ScrollViewer>
</TabItem>
<!-- Stats Tab -->
@ -282,6 +300,23 @@
<CheckBox IsChecked="{Binding IsFavorite}" Content="Favorite" Margin="4,0,0,0" />
</StackPanel>
<!-- Size/Scale Section -->
<StackPanel IsVisible="{Binding HasSizeData}" Spacing="0">
<TextBlock Text="Size" FontWeight="SemiBold" Margin="0,2,0,2" />
<Grid RowDefinitions="27,27,27" ColumnDefinitions="104,*">
<TextBlock Grid.Row="0" Grid.Column="0" Text="Height:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="0" Grid.Column="1" Value="{Binding HeightScalar}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="Weight:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding WeightScalar}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Scale:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasScale}" />
<NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding Scale}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasScale}" />
</Grid>
</StackPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
@ -294,14 +329,62 @@
<TextBlock Text="OT/Misc" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<Grid Margin="8" RowDefinitions="27,27,27" ColumnDefinitions="104,*">
<TextBlock Grid.Row="0" Grid.Column="0" Text="OT Name:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Ot}" Height="25" Width="144" HorizontalAlignment="Left" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="TID:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding Tid}" Minimum="0" Maximum="65535" Height="25" Width="80" HorizontalAlignment="Left" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="SID:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding Sid}" Minimum="0" Maximum="65535" Height="25" Width="80" HorizontalAlignment="Left" />
</Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid Margin="4,2,4,2" RowDefinitions="27,27,27,8,27,27,27,8,27,27" ColumnDefinitions="104,*">
<!-- OT Name + Gender -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="OT Name:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBox Text="{Binding Ot}" Height="25" Width="120" />
<Button Content="{Binding OtGenderSymbol}" Command="{Binding ToggleOtGenderCommand}"
FontSize="14" FontWeight="Bold" Width="24" Height="25" Padding="0" Margin="4,0,0,0"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
</StackPanel>
<!-- TID -->
<TextBlock Grid.Row="1" Grid.Column="0" Text="TID:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding Tid}" Minimum="0" Maximum="65535" Height="25" Width="80" HorizontalAlignment="Left" />
<!-- SID -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="SID:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding Sid}" Minimum="0" Maximum="65535" Height="25" Width="80" HorizontalAlignment="Left" />
<!-- Separator -->
<Border Grid.Row="3" Grid.ColumnSpan="2" BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<!-- Handler -->
<TextBlock Grid.Row="4" Grid.Column="0" Text="Handler:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="4" Grid.Column="1" SelectedIndex="{Binding CurrentHandler}" Height="25" Width="100" HorizontalAlignment="Left">
<ComboBoxItem Content="OT" />
<ComboBoxItem Content="Not OT" />
</ComboBox>
<!-- HT Name + Gender (visible when HasHandler) -->
<TextBlock Grid.Row="5" Grid.Column="0" Text="HT Name:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasHandler}" />
<StackPanel Grid.Row="5" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
IsVisible="{Binding HasHandler}">
<TextBox Text="{Binding HandlingTrainerName}" Height="25" Width="120" />
<TextBlock Text="{Binding HtGenderSymbol}" FontSize="14" FontWeight="Bold"
VerticalAlignment="Center" Margin="6,0,0,0" Width="16" />
</StackPanel>
<!-- Separator -->
<Border Grid.Row="7" Grid.ColumnSpan="2" BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<!-- Encryption Constant -->
<TextBlock Grid.Row="8" Grid.Column="0" Text="EC:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="8" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBox Text="{Binding EncryptionConstantHex}" Height="25" Width="72" FontFamily="Courier New,Consolas,monospace" />
<Button Content="Reroll" Command="{Binding RerollEcCommand}" Height="25" Margin="4,0,0,0" Padding="6,0" />
</StackPanel>
<!-- Home Tracker -->
<TextBlock Grid.Row="9" Grid.Column="0" Text="Tracker:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasHomeTracker}" />
<TextBox Grid.Row="9" Grid.Column="1" Text="{Binding HomeTrackerHex}" Height="25" Width="130" HorizontalAlignment="Left"
FontFamily="Courier New,Consolas,monospace" IsVisible="{Binding HasHomeTracker}" />
</Grid>
</ScrollViewer>
</TabItem>
</TabControl>
</DockPanel>