Explorar o código

Reinforce DataGrid Showing and point value modifying

SenGao hai 1 semana
pai
achega
20bf2dd688

+ 1 - 1
Tools/Mini8SlaveSim/Configuration/SharedConfig.cs

@@ -31,7 +31,7 @@ public class SharedConfig : ISharedConfig
         }
 
         _addressFileLoader.Load(path);
-        if (_hardwareAddress.Mini8sAddress.IsEmpty)
+        if (_hardwareAddress.Mini8sAddress.IsEmpty || _hardwareAddress.Mini8ChannelsAddress.IsEmpty)
         {
             return;
         }

+ 0 - 1
Tools/Mini8SlaveSim/Services/SlaveManagementService.cs

@@ -1,6 +1,5 @@
 using Mini8SlaveSim.Configuration;
 using ModbusSimulationProtocol.Services;
-using System.Collections.Concurrent;
 
 namespace Mini8SlaveSim.Services
 {

+ 191 - 85
Tools/Mini8SlaveSim/ViewModels/Mini8TabViewModel.cs

@@ -1,8 +1,10 @@
 using CommunityToolkit.Mvvm.ComponentModel;
 using CommunityToolkit.Mvvm.Input;
+using GeneralData;
 using Mini8SlaveSim.Configuration;
 using Mini8SlaveSim.Services;
 using System.Collections.ObjectModel;
+using System.Windows.Controls;
 using System.Windows.Threading;
 
 namespace Mini8SlaveSim.ViewModels;
@@ -12,11 +14,11 @@ public partial class RowItem : ObservableObject
     [ObservableProperty]
     private string _name = string.Empty;
     [ObservableProperty]
-    private string _ch1  = string.Empty;
+    private string _ch1 = string.Empty;
     [ObservableProperty]
-    private string _ch2  = string.Empty;
+    private string _ch2 = string.Empty;
     [ObservableProperty]
-    private string _ch3  = string.Empty;
+    private string _ch3 = string.Empty;
     [ObservableProperty]
     private string _ch4 = string.Empty;
     [ObservableProperty]
@@ -48,8 +50,7 @@ public partial class RowItem : ObservableObject
 enum DataType
 {
     UShort = 1,
-    Float = 2,
-    Double = 4
+    Float = 2
 }
 
 public partial class Mini8TabViewModel : ObservableObject
@@ -58,22 +59,22 @@ public partial class Mini8TabViewModel : ObservableObject
     private readonly ISlaveManagementService _slaveManagementService;
 
     private readonly byte _slaveId = 0;
-    private readonly Dictionary<string, Dictionary<byte,(ushort,DataType)>> _pointNamePosition = [];
+    private readonly Dictionary<string, Dictionary<byte, (ushort, DataType)>> _pointNamePosition = [];
     private readonly DispatcherTimer _timer;
 
     [ObservableProperty]
     private ObservableCollection<RowItem> _rowItems = [];
 
     [ObservableProperty]
-    private string _registerName=string.Empty;
+    private string _registerName = string.Empty;
 
     [ObservableProperty]
-    private string _channelNumber=string.Empty;
+    private string _channelNumber = string.Empty;
 
     [ObservableProperty]
-    private string _writeValue= string.Empty;
+    private string _writeValue = string.Empty;
 
-    public Mini8TabViewModel(ISharedConfig sharedConfig, ISlaveManagementService slaveManagementService) 
+    public Mini8TabViewModel(ISharedConfig sharedConfig, ISlaveManagementService slaveManagementService)
     {
         _sharedConfig = sharedConfig;
         _slaveManagementService = slaveManagementService;
@@ -85,6 +86,41 @@ public partial class Mini8TabViewModel : ObservableObject
     }
 
     [RelayCommand]
+    private void CellClick(SelectedCellsChangedEventArgs e)
+    {
+        var added = e.AddedCells.FirstOrDefault();
+        if (added.Column is null || added.Item is null)
+        {
+            return;
+        }
+
+        var row = (RowItem)added.Item;
+
+        var header = added.Column.Header.ToString() ?? string.Empty;
+        if (string.IsNullOrWhiteSpace(header))
+        {
+            return;
+        }
+
+        string chStr = string.Empty;
+        for (int i = 0; i < header.Length; i++)
+        {
+            if (Char.IsDigit(header[i]))
+            {
+                chStr += header[i];
+            }
+        }
+
+        if (string.IsNullOrWhiteSpace(chStr))
+        {
+            return;
+        }
+
+        RegisterName = row.Name;
+        ChannelNumber = chStr;
+    }
+
+    [RelayCommand]
     private void Write()
     {
         if (!_pointNamePosition.TryGetValue(RegisterName, out var register) || register is null)
@@ -101,26 +137,37 @@ public partial class Mini8TabViewModel : ObservableObject
             return;
         }
 
-        var finalValueStr = WriteValue.Replace("0x", "");
-        var registerNumber = (ushort)posDatatype.Item2;
-        if(finalValueStr.Length!= registerNumber*4)
+        var slave = _slaveManagementService.Slaves[_slaveId];
+        var dataStore = slave.SlaveDataStore;
+
+        if (posDatatype.Item2 == DataType.UShort)
         {
+            if (!ushort.TryParse(WriteValue, out var finalValue))
+            {
+                return;
+            }
+
+            slave.TryWriteValues(dataStore.HoldingRegisters, posDatatype.Item1, [finalValue]);
             return;
         }
 
-        ushort[] points=new ushort[registerNumber];
-        for (int i = 0; i < registerNumber; i++)
+        if (posDatatype.Item2 == DataType.Float)
         {
-            if (!ushort.TryParse(finalValueStr.Substring(i * 4, 4), System.Globalization.NumberStyles.HexNumber, null, out var finalValue))
+            if (!float.TryParse(WriteValue, out var floatValue))
             {
                 return;
             }
-            points[i] = finalValue;
+
+            var bytes = BitConverter.GetBytes(floatValue);
+            if(BitConverter.IsLittleEndian)
+            {
+                Array.Reverse(bytes);
+            }
+            
+            var high = BitConverter.ToUInt16([bytes[1],bytes[0]], 0);
+            var low = BitConverter.ToUInt16([bytes[3], bytes[2]], 0);
+            slave.TryWriteValues(dataStore.HoldingRegisters, posDatatype.Item1, [high, low]);
         }
-        
-        var slave = _slaveManagementService.Slaves[_slaveId];
-        var dataStore = slave.SlaveDataStore;
-        slave.TryWriteValues(dataStore.HoldingRegisters, posDatatype.Item1, points);
     }
 
     private void OnTimeup(object? sender, EventArgs e)
@@ -136,80 +183,139 @@ public partial class Mini8TabViewModel : ObservableObject
                 var chNumber = ch.Key;
                 var registerPos = ch.Value.Item1;
                 var usedRegister = (ushort)ch.Value.Item2;
+
                 var rst = slave.TryReadValues(dataStore.HoldingRegisters, registerPos, usedRegister, out var outPoints);
                 if (!rst || outPoints is null)
                 {
                     continue;
                 }
-                string valueStr = "0x";
-                foreach(var item in outPoints)
+
+                string valueStr = string.Empty;
+                foreach (var item in outPoints)
                 {
-                    valueStr += $"{item:X4}";
+                    var ushortStr = Convert.ToString(item, 2).PadLeft(16, '0');
+                    valueStr += ushortStr;
                 }
-                var rowitem = RowItems.First(item => item.Name == pointName);
-                App.Current.Dispatcher.BeginInvoke(() =>
+
+                if (usedRegister == (int)DataType.UShort)
                 {
-                    switch (chNumber)
+                    var value = Convert.ToUInt16(valueStr, 2);
+                    if (pointName == "AutoTuneStatus")
+                    {
+                        valueStr = value switch
+                        {
+                            (ushort)AutoTuneStatus.Unavailable => AutoTuneStatus.Unavailable.ToString(),
+                            (ushort)AutoTuneStatus.Ready => AutoTuneStatus.Ready.ToString(),
+                            (ushort)AutoTuneStatus.Triggered => AutoTuneStatus.Triggered.ToString(),
+                            (ushort)AutoTuneStatus.Tuning => AutoTuneStatus.Tuning.ToString(),
+                            (ushort)AutoTuneStatus.Complete => AutoTuneStatus.Complete.ToString(),
+                            (ushort)AutoTuneStatus.Aborted => AutoTuneStatus.Aborted.ToString(),
+                            (ushort)AutoTuneStatus.Timeout => AutoTuneStatus.Timeout.ToString(),
+                            (ushort)AutoTuneStatus.Overflow => AutoTuneStatus.Overflow.ToString(),
+                            _ => throw new NotImplementedException(),
+                        };
+                    }
+                    else if (pointName == "SensorBreakAlarm1" || pointName == "SensorBreakAlarm2")
                     {
-                        case 1:
-                            if (rowitem.Ch1 != valueStr) rowitem.Ch1 = valueStr;
-                            break;
-                        case 2:
-                            if (rowitem.Ch2 != valueStr) rowitem.Ch2 = valueStr;
-                            break;
-                        case 3:
-                            if (rowitem.Ch3 != valueStr) rowitem.Ch3 = valueStr;
-                            break;
-                        case 4:
-                            if (rowitem.Ch4 != valueStr) rowitem.Ch4 = valueStr;
-                            break;
-                        case 5:
-                            if (rowitem.Ch5 != valueStr) rowitem.Ch5 = valueStr;
-                            break;
-                        case 6:
-                            if (rowitem.Ch6 != valueStr) rowitem.Ch6 = valueStr;
-                            break;
-                        case 7:
-                            if (rowitem.Ch7 != valueStr) rowitem.Ch7 = valueStr;
-                            break;
-                        case 8:
-                            if (rowitem.Ch8 != valueStr) rowitem.Ch8 = valueStr;
-                            break;
-                        case 9:
-                            if (rowitem.Ch9 != valueStr) rowitem.Ch9 = valueStr;
-                            break;
-                        case 10:
-                            if (rowitem.Ch10 != valueStr) rowitem.Ch10 = valueStr;
-                            break;
-                        case 11:
-                            if (rowitem.Ch11 != valueStr) rowitem.Ch11 = valueStr;
-                            break;
-                        case 12:
-                            if (rowitem.Ch12 != valueStr) rowitem.Ch12 = valueStr;
-                            break;
-                        case 13:
-                            if (rowitem.Ch13 != valueStr) rowitem.Ch13 = valueStr;
-                            break;
-                        case 14:
-                            if (rowitem.Ch14 != valueStr) rowitem.Ch14 = valueStr;
-                            break;
-                        case 15:
-                            if (rowitem.Ch15 != valueStr) rowitem.Ch15 = valueStr;
-                            break;
-                        case 16:
-                            if (rowitem.Ch16 != valueStr) rowitem.Ch16 = valueStr;
-                            break;
-                        default:
-                            break;
+                        valueStr = value switch
+                        {
+                            (ushort)TcBorken.Normal => TcBorken.Normal.ToString(),
+                            (ushort)TcBorken.Error => TcBorken.Error.ToString(),
+                            _ => throw new NotImplementedException(),
+                        };
                     }
-                });
+                    else if (pointName == "ActiveTuneSet")
+                    {
+                        valueStr = value switch
+                        {
+                            (ushort)ActiveTuneSet.AutoTune => ActiveTuneSet.AutoTune.ToString(),
+                            (ushort)ActiveTuneSet.Running => ActiveTuneSet.Running.ToString(),
+                            _ => throw new NotImplementedException(),
+                        };
+                    }
+                    else if (pointName == "Inhibit")
+                    {
+                        valueStr = value switch
+                        {
+                            (ushort)Inhibit.Enable => Inhibit.Enable.ToString(),
+                            (ushort)Inhibit.Disable => Inhibit.Disable.ToString(),
+                            _ => throw new NotImplementedException(),
+                        };
+                    }
+                    else
+                    {
+                        valueStr = value.ToString();
+                    }
+                }
+                if (usedRegister == (int)DataType.Float)
+                {
+                    uint intValue = Convert.ToUInt32(valueStr, 2);
+                    byte[] bytes = BitConverter.GetBytes(intValue);
+                    var value = BitConverter.ToSingle(bytes, 0);
+                    valueStr = value.ToString();
+                }
+
+                var rowitem = RowItems.First(item => item.Name == pointName);
+                switch (chNumber)
+                {
+                    case 1:
+                        if (rowitem.Ch1 != valueStr) rowitem.Ch1 = valueStr;
+                        break;
+                    case 2:
+                        if (rowitem.Ch2 != valueStr) rowitem.Ch2 = valueStr;
+                        break;
+                    case 3:
+                        if (rowitem.Ch3 != valueStr) rowitem.Ch3 = valueStr;
+                        break;
+                    case 4:
+                        if (rowitem.Ch4 != valueStr) rowitem.Ch4 = valueStr;
+                        break;
+                    case 5:
+                        if (rowitem.Ch5 != valueStr) rowitem.Ch5 = valueStr;
+                        break;
+                    case 6:
+                        if (rowitem.Ch6 != valueStr) rowitem.Ch6 = valueStr;
+                        break;
+                    case 7:
+                        if (rowitem.Ch7 != valueStr) rowitem.Ch7 = valueStr;
+                        break;
+                    case 8:
+                        if (rowitem.Ch8 != valueStr) rowitem.Ch8 = valueStr;
+                        break;
+                    case 9:
+                        if (rowitem.Ch9 != valueStr) rowitem.Ch9 = valueStr;
+                        break;
+                    case 10:
+                        if (rowitem.Ch10 != valueStr) rowitem.Ch10 = valueStr;
+                        break;
+                    case 11:
+                        if (rowitem.Ch11 != valueStr) rowitem.Ch11 = valueStr;
+                        break;
+                    case 12:
+                        if (rowitem.Ch12 != valueStr) rowitem.Ch12 = valueStr;
+                        break;
+                    case 13:
+                        if (rowitem.Ch13 != valueStr) rowitem.Ch13 = valueStr;
+                        break;
+                    case 14:
+                        if (rowitem.Ch14 != valueStr) rowitem.Ch14 = valueStr;
+                        break;
+                    case 15:
+                        if (rowitem.Ch15 != valueStr) rowitem.Ch15 = valueStr;
+                        break;
+                    case 16:
+                        if (rowitem.Ch16 != valueStr) rowitem.Ch16 = valueStr;
+                        break;
+                    default:
+                        break;
+                }
             }
         }
     }
 
     private void Initialize()
     {
-        if(_slaveId<=0)
+        if (_slaveId <= 0)
         {
             return;
         }
@@ -230,20 +336,20 @@ public partial class Mini8TabViewModel : ObservableObject
             AddData(nameof(ch.Value.Running_P), ch.Key, ch.Value.Running_P, DataType.Float);
             AddData(nameof(ch.Value.Running_I), ch.Key, ch.Value.Running_I, DataType.Float);
             AddData(nameof(ch.Value.Running_D), ch.Key, ch.Value.Running_D, DataType.Float);
-            AddData(nameof(ch.Value.Inhibit), ch.Key, ch.Value.Inhibit, DataType.Float);
+            AddData(nameof(ch.Value.Inhibit), ch.Key, ch.Value.Inhibit, DataType.UShort);
             AddData(nameof(ch.Value.ActiveAutoTune), ch.Key, ch.Value.ActiveAutoTune, DataType.Float);
             AddData(nameof(ch.Value.SetpointUpRate), ch.Key, ch.Value.SetpointUpRate, DataType.Float);
             AddData(nameof(ch.Value.SetpointDownRate), ch.Key, ch.Value.SetpointDownRate, DataType.Float);
-            AddData(nameof(ch.Value.Caps), ch.Key, ch.Value.Caps, DataType.Double);
-            AddData(nameof(ch.Value.Floor), ch.Key, ch.Value.Floor, DataType.Double);
-            AddData(nameof(ch.Value.CapsWarning), ch.Key, ch.Value.CapsWarning, DataType.Double);
-            AddData(nameof(ch.Value.FloorWarning), ch.Key, ch.Value.FloorWarning, DataType.Double);
+            AddData(nameof(ch.Value.Caps), ch.Key, ch.Value.Caps, DataType.UShort);
+            AddData(nameof(ch.Value.Floor), ch.Key, ch.Value.Floor, DataType.UShort);
+            AddData(nameof(ch.Value.CapsWarning), ch.Key, ch.Value.CapsWarning, DataType.UShort);
+            AddData(nameof(ch.Value.FloorWarning), ch.Key, ch.Value.FloorWarning, DataType.UShort);
         }
 
         _timer.Start();
     }
 
-    private void AddData(string name, byte key, ushort value,DataType dataType)
+    private void AddData(string name, byte key, ushort value, DataType dataType)
     {
         if (!_pointNamePosition.ContainsKey(name))
         {

+ 4 - 40
Tools/Mini8SlaveSim/ViewModels/SettingBarViewModel.cs

@@ -13,23 +13,9 @@ namespace Mini8SlaveSim.ViewModels
         private readonly ISharedConfig _sharedConfig;
         private readonly ISlaveManagementService _slaveManagementService;
 
-        private byte? _selectedMini8Index;
-
         [ObservableProperty]
         private string _selectedFolderPath = string.Empty;
 
-        [ObservableProperty]
-        private ConcurrentDictionary<byte, Mini8Address> _mini8sInfo = [];
-
-        [ObservableProperty]
-        private KeyValuePair<byte, Mini8Address> _mini8Info = new();
-
-        [ObservableProperty]
-        private string _ipAddress = string.Empty;
-
-        [ObservableProperty]
-        private string _port = string.Empty;
-
         public SettingBarViewModel(ISharedConfig sharedConfig, ISlaveManagementService slaveManagementService)
         {
             _sharedConfig = sharedConfig;
@@ -37,7 +23,7 @@ namespace Mini8SlaveSim.ViewModels
         }
 
         [RelayCommand]
-        private void SelectFolderPath()
+        private void SelectFolder()
         {
             var dialog = new OpenFolderDialog()
             {
@@ -53,42 +39,20 @@ namespace Mini8SlaveSim.ViewModels
         [RelayCommand]
         private void CreateSlave()
         {
-            if (_selectedMini8Index is null)
+            if (!_sharedConfig.IsLoaded)
             {
                 return;
             }
 
-            if (_sharedConfig.HardwareAddress.Mini8sAddress[_selectedMini8Index.Value].Address is null)
+            foreach (var mini8 in _sharedConfig.HardwareAddress.Mini8sAddress)
             {
-                return;
+                _slaveManagementService.AddSlave(mini8.Key);
             }
-
-            _slaveManagementService.AddSlave(_selectedMini8Index.Value);
         }
 
         partial void OnSelectedFolderPathChanged(string value)
         {
-            Mini8sInfo.Clear();
             _sharedConfig.Load(value);
-            if (_sharedConfig.IsLoaded)
-            {
-                Mini8sInfo = _sharedConfig.HardwareAddress.Mini8sAddress;
-            }
-        }
-
-        partial void OnMini8InfoChanged(KeyValuePair<byte, Mini8Address> value)
-        {
-            if(value.Value.Address is null)
-            {
-                IpAddress = "";
-                Port = "";
-                _selectedMini8Index = null;
-                return;
-            }
-
-            _selectedMini8Index = value.Value.Index;
-            IpAddress = value.Value.Address;
-            Port = value.Value.Port.ToString();
         }
     }
 }

+ 2 - 2
Tools/Mini8SlaveSim/ViewModels/WorkAreaViewModel.cs

@@ -28,10 +28,10 @@ namespace Mini8SlaveSim.ViewModels
             {
                 Tabs.Add(new TabItem()
                 {
-                    Header = e.ToString(),
+                    Header = $"Slave ID:{e}",
                     Content = new Mini8Tab()
                 });
-                SelectedTabIndex = Tabs.Count - 1;
+                SelectedTabIndex = 0;
             });
         }
     }

+ 5 - 5
Tools/Mini8SlaveSim/Views/MainWindow.xaml

@@ -7,13 +7,13 @@
         xmlns:prism="http://prismlibrary.com/"
         prism:ViewModelLocator.AutoWireViewModel="True"
         mc:Ignorable="d"
-        Title="Mini8SlaveSim" Height="640" Width="800" ResizeMode="CanMinimize">
+        Title="Mini8SlaveSim" Height="700" Width="800">
     <Grid>
         <Grid.RowDefinitions>
-            <RowDefinition Height="110"/>
-            <RowDefinition Height="500"/>
+            <RowDefinition Height="1*"/>
+            <RowDefinition Height="4*"/>
         </Grid.RowDefinitions>
-        <local:SettingBar Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
-        <local:WorkArea Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
+        <local:SettingBar Grid.Row="0" />
+        <local:WorkArea Grid.Row="1" />
     </Grid>
 </Window>

+ 12 - 6
Tools/Mini8SlaveSim/Views/Mini8Tab.xaml

@@ -3,17 +3,18 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
              xmlns:local="clr-namespace:Mini8SlaveSim.Views"
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
-             mc:Ignorable="d" 
-             Width="750" Height="450">
+             mc:Ignorable="d"
+             d:Height="600" d:Width="800">
     <Grid Background="#FFB4EDEA" >
         <Grid.RowDefinitions>
-            <RowDefinition Height="350"/>
-            <RowDefinition Height="100"/>
+            <RowDefinition Height="4*"/>
+            <RowDefinition Height="0.5*"/>
         </Grid.RowDefinitions>
-        <DataGrid Grid.Row="0" ItemsSource="{Binding RowItems}" IsReadOnly="True" CanUserSortColumns="False" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" Margin="10,10,10,10" Background="#FFF3D9D9"> 
+        <DataGrid Grid.Row="0" ItemsSource="{Binding RowItems}" IsReadOnly="True" SelectionUnit="Cell" CanUserSortColumns="False" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" Margin="10,10,10,10" Background="#FFF3D9D9"> 
             <DataGrid.Columns>
                 <DataGridTextColumn Header="Point" Binding="{Binding Name}"/>
                 <DataGridTextColumn Header="Ch1" Binding="{Binding Ch1}"/>
@@ -33,10 +34,15 @@
                 <DataGridTextColumn Header="Ch15" Binding="{Binding Ch15}"/>
                 <DataGridTextColumn Header="Ch16" Binding="{Binding Ch16}"/>
             </DataGrid.Columns>
+            <i:Interaction.Triggers>
+                <i:EventTrigger EventName="SelectedCellsChanged">
+                    <i:InvokeCommandAction Command="{Binding CellClickCommand}" PassEventArgsToCommand="True"/>
+                </i:EventTrigger>
+            </i:Interaction.Triggers>
         </DataGrid>
         <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="10,10,10,10" HorizontalAlignment="Center" VerticalAlignment="Center">
             <Label Content="Point:" HorizontalAlignment="Center" VerticalAlignment="Center"/>
-            <TextBox Text="{Binding RegisterName}" Height="25" Width="150" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+            <TextBox Text="{Binding RegisterName}" IsEnabled="False" Height="25" Width="150" HorizontalAlignment="Center" VerticalAlignment="Center"/>
             <Label Content="Ch:" HorizontalAlignment="Center" VerticalAlignment="Center"/>
             <TextBox Text="{Binding ChannelNumber}" Height="25" Width="150" HorizontalAlignment="Center" VerticalAlignment="Center"/>
             <Label Content="Value:" HorizontalAlignment="Center" VerticalAlignment="Center"/>

+ 8 - 15
Tools/Mini8SlaveSim/Views/SettingBar.xaml

@@ -6,26 +6,19 @@
              xmlns:local="clr-namespace:Mini8SlaveSim.Views"
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
-             mc:Ignorable="d" 
-             Width="780" Height="100">
+             mc:Ignorable="d">
     <Grid Background="#FFCECECE">
         <Grid.RowDefinitions>
-            <RowDefinition Height="50"/>
-            <RowDefinition Height="50"/>
+            <RowDefinition Height="1*"/>
+            <RowDefinition Height="1*"/>
         </Grid.RowDefinitions>
-        <StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
-            <Button Content="Select Folder" Command="{Binding SelectFolderPathCommand}" Height="25" Width="90"/>
+        <StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,10,10,10">
+            <Button Content="Select Folder" Command="{Binding SelectFolderCommand}" Height="25" Width="90"/>
             <Label Content="Folder Path:" Height="25" Width="80" Margin="10,0,0,0"/>
-            <TextBox Text="{Binding SelectedFolderPath}" Height="25" Width="500" Margin="10,0,0,0"/>
+            <TextBox Text="{Binding SelectedFolderPath}" IsEnabled="False" Height="25" Width="500" Margin="10,0,0,0"/>
         </StackPanel>
-        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
-            <Label Content="Mini8 ID: "/>
-            <ComboBox ItemsSource="{Binding Mini8sInfo}" DisplayMemberPath="Value.Index" SelectedItem="{Binding Mini8Info}" Height="25" Width="80"/>
-            <Label Content="Ip:" Margin="20,0,0,0"/>
-            <Label Content="{Binding IpAddress}" Margin="10,0,0,0" Width="100"/>
-            <Label Content="Port" Margin="10,0,0,0"/>
-            <Label Content="{Binding Port}" Width="100"/>
-            <Button Content="Create Slave" Command="{Binding CreateSlaveCommand}" Height="25" Width="80" Margin="30,0,0,0" />
+        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10,10,10,10">
+            <Button Content="Create Slave" Command="{Binding CreateSlaveCommand}" Height="25" Width="80"/>
         </StackPanel>
     </Grid>
 </UserControl>

+ 4 - 4
Tools/Mini8SlaveSim/Views/WorkArea.xaml

@@ -6,9 +6,9 @@
              xmlns:local="clr-namespace:Mini8SlaveSim.Views"
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
-             mc:Ignorable="d" 
-             Width="780" Height="480">
-    <Grid Background="#FFCECECE">
-        <TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedTabIndex}" Margin="5,5,5,5" />
+             mc:Ignorable="d"
+             d:Height="700" d:Width="800">
+    <Grid Background="#FFCECECE" Margin="10,10,10,10">
+        <TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedTabIndex}" Margin="10,10,10,10" />
     </Grid>
 </UserControl>