TL;DR - I have successfully created the components which can read a JSON file from a URL and present it to my application. I want to be able to change some of the values in the JSON using XAML WPF and then save the changed items to a local JSON file.
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Newtonsoft.Json;
using System.Net.Http;
namespace NewApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
appxConfigsUri.Text = "https://raw.githubusercontent.com/msft-jasonparker/WPF-Test/main/appconfig.json";
}
async void btnLoadAppxJson_Click(object sender, RoutedEventArgs e)
{
string Uri = appxConfigsUri.Text;
var httpClient = new HttpClient();
var resultJson = await httpClient.GetStringAsync(Uri);
var resultPackages = JsonConvert.DeserializeObject<AppConfigs[]>(resultJson);
appconfigs.ItemsSource = resultPackages;
}
private void btnSaveJsonToFile_Click(object sender, RoutedEventArgs e)
{
}
}
}
MainWindow.xaml
<Window x:Class="NewApp.MainWindow"
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:NewApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" MaxWidth="800">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<TabControl x:Name="tabControl">
<TabItem Header="App Config">
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Top">
<Label Content="Source:" Margin="5,5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Bold" FontSize="13.333" Width="100" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" Padding="5,1,5,1"/>
<TextBox x:Name="appxConfigsUri" Text="appconfig.json" Margin="110,5,5,0" TextWrapping="WrapWithOverflow" FontSize="13.333" TextAlignment="Justify" Height="38" VerticalAlignment="Top" Padding="5,0,0,0" MinWidth="450" IsReadOnly="True" BorderBrush="{x:Null}" IsTabStop="False" BorderThickness="0,0,0,0"/>
<Button x:Name="btnLoadAppxJson" Content="Load JSON" Width="100" Height="28" Margin="5,48,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Normal" FontSize="14.667" Click="btnLoadAppxJson_Click"/>
<Button x:Name="btnSaveJsonToFile" Content="Save JSON" Width="100" Height="28" Margin="122,48,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="Normal" FontSize="14.667" Click="btnSaveJsonToFile_Click"/>
<Separator HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="5,85,5,0"/>
<StackPanel Margin="5,90,5,5" Background="#FFDADADA" ScrollViewer.CanContentScroll="True">
<ListView x:Name="appconfigs" Background="#FFC5C5C5" BorderBrush="{x:Null}" HorizontalContentAlignment="Stretch" HorizontalAlignment="Left" Margin="5,5,5,5" ScrollViewer.CanContentScroll="True">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel ScrollViewer.CanContentScroll="True">
<Grid x:Name="ItemLayout" HorizontalAlignment="Left" Background="#FF858585" Margin="5,5,5,5" ScrollViewer.CanContentScroll="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="494"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="28"/>
<RowDefinition MinHeight="28"/>
<RowDefinition MinHeight="28"/>
<RowDefinition MinHeight="28" MaxHeight="90"/>
</Grid.RowDefinitions>
<Label Content="Package Name:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Center" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Margin="5,0,5,0" FontWeight="Bold" Padding="1,1,1,1"/>
<TextBlock Text="{Binding ItemName}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Center" Padding="5,0,5,0" ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" Margin="5,0,5,0"/>
<Label Content="Recommended Setting:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Margin="5,0,5,0" FontWeight="Bold" Padding="1,1,1,1"/>
<TextBlock Text="{Binding Setting}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Padding="5,0,5,0" ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" Margin="5,0,5,0"/>
<Label Content="New Setting:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Center" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Margin="5,0,5,0" FontWeight="Bold" Padding="1,1,1,1"/>
<ComboBox Grid.Column="1" Grid.Row="2" Margin="5,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Not Configured" >
<ComboBoxItem Content="Enabled"/>
<ComboBoxItem Content="Disabled"/>
</ComboBox>
<Label Content="Description:" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Stretch" VerticalAlignment="Top" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Margin="5,5,5,5" FontWeight="Bold" Padding="1,1,1,1"/>
<TextBox VerticalScrollBarVisibility="Auto" Text="{Binding Description}" Grid.Column="1" Grid.Row="3" Padding="5,2,5,2" TextWrapping="WrapWithOverflow" Margin="5,5,5,5" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" IsReadOnly="True" Height="80" MinWidth="450"/>
</Grid>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
</ScrollViewer>
</TabItem>
<TabItem Header="Future Config">
<Grid Background="#FFE5E5E5"/>
</TabItem>
</TabControl>
</Window>
configurations.cs
using System;
using Newtonsoft.Json;
namespace NewApp
{
public class AppConfigs
{
[JsonProperty("ItemName")]
public string ItemName { get; set; }
[JsonProperty("Setting")]
public string Setting { get; set; }
[JsonProperty("URL")]
public Uri Url { get; set; }
[JsonProperty("Description")]
public string Description { get; set; }
}
}
Ideally, the app will have multiple tabs for various configurations. The user would adjust the configurations in the UI and then save the new settings as JSON to the local system.
XAML and C# is not my primary skill, but learning as I go. Any help would be appreciated!