feat: load resources from dictionary.

This commit is contained in:
rabbitism 2023-02-11 23:04:07 +08:00
parent 9499bab92f
commit 7fd45c7342
5 changed files with 141 additions and 15 deletions

View File

@ -2,7 +2,8 @@
x:Class="Semi.Avalonia.Demo.Desktop.App" x:Class="Semi.Avalonia.Demo.Desktop.App"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Semi.Avalonia.Demo.Desktop"> xmlns:local="using:Semi.Avalonia.Demo.Desktop"
RequestedThemeVariant="Dark">
<Application.Styles> <Application.Styles>
<!--<StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" />--> <!--<StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" />-->
<StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" /> <StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" />

View File

@ -4,31 +4,68 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels"
d:DesignHeight="450" d:DesignHeight="450"
d:DesignWidth="800" d:DesignWidth="800"
mc:Ignorable="d"> mc:Ignorable="d">
<Design.DataContext>
<viewModels:PaletteDemoViewModel />
</Design.DataContext>
<SplitView <SplitView
CompactPaneLength="100" Name="splitView"
CompactPaneLength="50"
DisplayMode="CompactInline" DisplayMode="CompactInline"
IsPaneOpen="{Binding #toggle.IsChecked, Mode=TwoWay}" IsPaneOpen="{Binding #toggle.IsChecked, Mode=TwoWay}"
OpenPaneLength="300" OpenPaneLength="300"
PanePlacement="Right"> PanePlacement="Right">
<SplitView.Pane> <SplitView.Pane>
<Border Theme="{DynamicResource CardBorder}"> <StackPanel>
<StackPanel> <ToggleButton
<ToggleButton Name="toggle"
Name="toggle" HorizontalAlignment="Right"
HorizontalAlignment="Right" Theme="{DynamicResource BorderlessToggleButton}">
Content="Detail" /> <PathIcon
<TextBlock Text="Hello" /> Width="16"
</StackPanel> Height="16"
</Border> Data="M5 2H19C20.6569 2 22 3.34315 22 5V19C22 20.6569 20.6569 22 19 22H5C3.34315 22 2 20.6569 2 19V5C2 3.34315 3.34315 2 5 2ZM6 4C5.44772 4 5 4.44772 5 5V19C5 19.5523 5.44772 20 6 20H9C9.55229 20 10 19.5523 10 19V5C10 4.44772 9.55229 4 9 4H6Z" />
</ToggleButton>
<Border IsVisible="{Binding #splitView.IsPaneOpen}" Theme="{DynamicResource CardBorder}">
<StackPanel>
<TextBlock Text="Hello" />
</StackPanel>
</Border>
</StackPanel>
</SplitView.Pane> </SplitView.Pane>
<SplitView.Content> <SplitView.Content>
<StackPanel> <ScrollViewer>
<TextBlock Text="Content" /> <StackPanel>
</StackPanel> <ItemsControl Items="{Binding Series}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewModels:ColorSeries">
<DockPanel>
<TextBlock DockPanel.Dock="Top" Text=" " />
<ItemsControl Items="{Binding Color}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="10" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewModels:ColorItemViewModel">
<Border Height="60" Background="{Binding Color}">
<TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
</SplitView.Content> </SplitView.Content>
</SplitView> </SplitView>
</UserControl> </UserControl>

View File

@ -1,6 +1,7 @@
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Semi.Avalonia.Demo.ViewModels;
namespace Semi.Avalonia.Demo.Pages; namespace Semi.Avalonia.Demo.Pages;
@ -9,5 +10,6 @@ public partial class PaletteDemo : UserControl
public PaletteDemo() public PaletteDemo()
{ {
InitializeComponent(); InitializeComponent();
this.DataContext = new PaletteDemoViewModel();
} }
} }

View File

@ -27,7 +27,6 @@
<Style Selector="^ /template/ PathIcon"> <Style Selector="^ /template/ PathIcon">
<Setter Property="PathIcon.Data" Value="M12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23ZM17 15C17.476 15 17.9408 14.9525 18.3901 14.862C17.296 17.3011 14.8464 19 12 19C8.13401 19 5 15.866 5 12C5 8.60996 7.40983 5.78277 10.6099 5.13803C10.218 6.01173 10 6.98041 10 8C10 11.866 13.134 15 17 15Z" /> <Setter Property="PathIcon.Data" Value="M12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23ZM17 15C17.476 15 17.9408 14.9525 18.3901 14.862C17.296 17.3011 14.8464 19 12 19C8.13401 19 5 15.866 5 12C5 8.60996 7.40983 5.78277 10.6099 5.13803C10.218 6.01173 10 6.98041 10 8C10 11.866 13.134 15 17 15Z" />
</Style> </Style>
</Style> </Style>
</ControlTheme> </ControlTheme>
</ResourceDictionary> </ResourceDictionary>

View File

@ -1,4 +1,8 @@
using System;
using System.Collections.ObjectModel;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
namespace Semi.Avalonia.Demo.ViewModels; namespace Semi.Avalonia.Demo.ViewModels;
@ -6,12 +10,95 @@ namespace Semi.Avalonia.Demo.ViewModels;
public class PaletteDemoViewModel: ObservableObject public class PaletteDemoViewModel: ObservableObject
{ {
private string[] _colors = { "Amber","Blue","Cyan","Green","Grey","Indigo","LightBlue","LightGreen","Lime","Orange","Pink","Purple","Red","Teal","Violet","Yellow" }; private string[] _colors = { "Amber","Blue","Cyan","Green","Grey","Indigo","LightBlue","LightGreen","Lime","Orange","Pink","Purple","Red","Teal","Violet","Yellow" };
private ObservableCollection<ColorSeries> _series;
public ObservableCollection<ColorSeries> Series
{
get => _series;
set => SetProperty(ref _series, value);
}
public PaletteDemoViewModel()
{
Series = new ObservableCollection<ColorSeries>();
var resouceDictionary = (ResourceDictionary)(AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Light/Palette.axaml")));
foreach (var color in _colors)
{
ColorSeries s = new ColorSeries();
s.Initialize(resouceDictionary, color);
Series.Add(s);
}
}
} }
public class ColorSeries: ObservableObject public class ColorSeries: ObservableObject
{ {
private ObservableCollection<ColorItemViewModel>? _colors;
public ObservableCollection<ColorItemViewModel>? Color
{
get => _colors;
set => SetProperty(ref _colors, value);
}
private string? _seriesName;
public string? SeriesName
{
get => _seriesName;
set => SetProperty(ref _seriesName, value);
}
internal void Initialize(IResourceDictionary resourceDictionary, string color) internal void Initialize(IResourceDictionary resourceDictionary, string color)
{ {
SeriesName = color;
Color = new ObservableCollection<ColorItemViewModel>();
for (int i = 0; i < 10; i++)
{
var key = "Semi" + color + i;
if (resourceDictionary.TryGetValue(key, out var value))
{
if (value is SolidColorBrush brush)
{
string name = color + " " + i;
var item = new ColorItemViewModel(name, brush, key);
Color.Add(item);
}
}
}
}
}
public class ColorItemViewModel : ObservableObject
{
private IBrush _color;
public IBrush Color
{
get => _color;
set => SetProperty(ref _color, value);
}
private string _name;
public string Name
{
get => _name;
set => SetProperty(ref _name, value);
}
private string _resourceKey;
public string ResourceKey
{
get => _resourceKey;
set => SetProperty(ref _resourceKey, value);
}
public ColorItemViewModel(string name, IBrush color, string resourceKey)
{
Name = name;
Color = color;
ResourceKey = resourceKey;
} }
} }