Skip to content

Commit 045ced1

Browse files
committed
chore: add avalonia TabControl demo.
1 parent bbb2db1 commit 045ced1

File tree

12 files changed

+682
-84
lines changed

12 files changed

+682
-84
lines changed

src/Avalonia/HandyControlDemo_Avalonia/UserControl/Main/LeftMainContent.axaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
BorderThickness="0"
1515
Background="{DynamicResource SecondaryRegionBrush}" />
1616
<TabControl BorderThickness="0 1 0 0"
17-
Classes="inline"
17+
Theme="{StaticResource TabControlInLine}"
1818
SelectionChanged="TabControl_OnSelectionChanged"
1919
ItemsSource="{Binding DemoInfoCollection}"
2020
Background="Transparent"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
<UserControl xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
x:Class="HandyControlDemo.UserControl.NativeTabControlDemo"
4+
xmlns:hc="https://handyorg.github.io/handycontrol">
5+
<ScrollViewer>
6+
<hc:UniformSpacingPanel Margin="32"
7+
Spacing="32"
8+
ItemWidth="400"
9+
ItemHeight="200"
10+
MaxWidth="832"
11+
ChildWrapping="Wrap">
12+
<TabControl TabStripPlacement="Right">
13+
<TabItem Header="Title1">
14+
<Border>
15+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
16+
<Run Text="Text" />
17+
<Run Text="1" />
18+
</TextBlock>
19+
</Border>
20+
</TabItem>
21+
<TabItem Header="Title2"
22+
IsEnabled="False">
23+
<Border>
24+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
25+
<Run Text="Text" />
26+
<Run Text="2" />
27+
</TextBlock>
28+
</Border>
29+
</TabItem>
30+
<TabItem Header="Title3">
31+
<Border>
32+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
33+
<Run Text="Text" />
34+
<Run Text="3" />
35+
</TextBlock>
36+
</Border>
37+
</TabItem>
38+
<TabItem Header="Title4">
39+
<Border>
40+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
41+
<Run Text="Text" />
42+
<Run Text="4" />
43+
</TextBlock>
44+
</Border>
45+
</TabItem>
46+
<TabItem Header="Title5">
47+
<Border>
48+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
49+
<Run Text="Text" />
50+
<Run Text="5" />
51+
</TextBlock>
52+
</Border>
53+
</TabItem>
54+
</TabControl>
55+
<TabControl Theme="{StaticResource TabControlInLine}">
56+
<TabItem Header="Title1">
57+
<Border>
58+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
59+
<Run Text="Text" />
60+
<Run Text="1" />
61+
</TextBlock>
62+
</Border>
63+
</TabItem>
64+
<TabItem Header="Title2">
65+
<Border>
66+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
67+
<Run Text="Text" />
68+
<Run Text="2" />
69+
</TextBlock>
70+
</Border>
71+
</TabItem>
72+
<TabItem Header="Title3">
73+
<Border>
74+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
75+
<Run Text="Text" />
76+
<Run Text="3" />
77+
</TextBlock>
78+
</Border>
79+
</TabItem>
80+
<TabItem Header="Title4">
81+
<Border>
82+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
83+
<Run Text="Text" />
84+
<Run Text="4" />
85+
</TextBlock>
86+
</Border>
87+
</TabItem>
88+
<TabItem Header="Title5"
89+
IsSelected="True">
90+
<Border>
91+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
92+
<Run Text="Text" />
93+
<Run Text="5" />
94+
</TextBlock>
95+
</Border>
96+
</TabItem>
97+
</TabControl>
98+
<TabControl TabStripPlacement="Left"
99+
Theme="{StaticResource TabControlCapsule}">
100+
<TabItem Header="Title1">
101+
<Border>
102+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
103+
<Run Text="Text" />
104+
<Run Text="1" />
105+
</TextBlock>
106+
</Border>
107+
</TabItem>
108+
<TabItem IsSelected="True"
109+
Header="Title2">
110+
<Border>
111+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
112+
<Run Text="Text" />
113+
<Run Text="2" />
114+
</TextBlock>
115+
</Border>
116+
</TabItem>
117+
<TabItem Header="Title3">
118+
<Border>
119+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
120+
<Run Text="Text" />
121+
<Run Text="3" />
122+
</TextBlock>
123+
</Border>
124+
</TabItem>
125+
<TabItem Header="Title4">
126+
<Border>
127+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
128+
<Run Text="Text" />
129+
<Run Text="4" />
130+
</TextBlock>
131+
</Border>
132+
</TabItem>
133+
<TabItem Header="Title5">
134+
<Border>
135+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
136+
<Run Text="Text" />
137+
<Run Text="5" />
138+
</TextBlock>
139+
</Border>
140+
</TabItem>
141+
</TabControl>
142+
<TabControl TabStripPlacement="Bottom"
143+
Theme="{StaticResource TabControlCapsuleSolid}">
144+
<TabItem Header="Title1">
145+
<Border>
146+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
147+
<Run Text="Text" />
148+
<Run Text="1" />
149+
</TextBlock>
150+
</Border>
151+
</TabItem>
152+
<TabItem IsEnabled="False"
153+
Header="Title2">
154+
<Border>
155+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
156+
<Run Text="Text" />
157+
<Run Text="2" />
158+
</TextBlock>
159+
</Border>
160+
</TabItem>
161+
<TabItem Header="Title3">
162+
<Border>
163+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
164+
<Run Text="Text" />
165+
<Run Text="3" />
166+
</TextBlock>
167+
</Border>
168+
</TabItem>
169+
<TabItem IsSelected="True"
170+
Header="Title4">
171+
<Border>
172+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
173+
<Run Text="Text" />
174+
<Run Text="4" />
175+
</TextBlock>
176+
</Border>
177+
</TabItem>
178+
<TabItem Header="Title5">
179+
<Border>
180+
<TextBlock Theme="{StaticResource TextBlockLargeBold}">
181+
<Run Text="Text" />
182+
<Run Text="5" />
183+
</TextBlock>
184+
</Border>
185+
</TabItem>
186+
</TabControl>
187+
</hc:UniformSpacingPanel>
188+
</ScrollViewer>
189+
</UserControl>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace HandyControlDemo.UserControl;
2+
3+
public partial class NativeTabControlDemo : Avalonia.Controls.UserControl
4+
{
5+
public NativeTabControlDemo()
6+
{
7+
InitializeComponent();
8+
}
9+
}
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using Avalonia;
2+
using Avalonia.Controls;
3+
using HandyControl.Tools;
4+
5+
namespace HandyControl.Controls;
6+
7+
public class ItemsControlAttach
8+
{
9+
public static readonly AttachedProperty<ThemeSelector?> ItemsContainerThemeSelectorProperty =
10+
AvaloniaProperty.RegisterAttached<ItemsControlAttach, AvaloniaObject, ThemeSelector?>(
11+
"ItemsContainerThemeSelector");
12+
13+
public static void SetItemsContainerThemeSelector(AvaloniaObject element, ThemeSelector? value) =>
14+
element.SetValue(ItemsContainerThemeSelectorProperty, value);
15+
16+
public static ThemeSelector? GetItemsContainerThemeSelector(AvaloniaObject element) =>
17+
element.GetValue(ItemsContainerThemeSelectorProperty);
18+
19+
static ItemsControlAttach()
20+
{
21+
ItemsContainerThemeSelectorProperty.Changed.AddClassHandler<AvaloniaObject>(
22+
OnItemsContainerThemeSelectorChanged);
23+
}
24+
25+
private static void OnItemsContainerThemeSelectorChanged(AvaloniaObject element, AvaloniaPropertyChangedEventArgs e)
26+
{
27+
if (element is not ItemsControl itemsControl)
28+
{
29+
return;
30+
}
31+
32+
itemsControl.ContainerPrepared -= OnContainerPrepared;
33+
var themeSelector = e.GetNewValue<ThemeSelector?>();
34+
35+
if (themeSelector is null)
36+
{
37+
return;
38+
}
39+
40+
itemsControl.ContainerPrepared += OnContainerPrepared;
41+
ApplyTheme(itemsControl, themeSelector);
42+
}
43+
44+
private static void OnContainerPrepared(object? sender, ContainerPreparedEventArgs e)
45+
{
46+
if (sender is not ItemsControl itemsControl)
47+
{
48+
return;
49+
}
50+
51+
var themeSelector = GetItemsContainerThemeSelector(itemsControl);
52+
if (themeSelector is null)
53+
{
54+
return;
55+
}
56+
57+
ApplyTheme(itemsControl, themeSelector);
58+
}
59+
60+
private static void ApplyTheme(ItemsControl itemsControl, ThemeSelector themeSelector)
61+
{
62+
for (int i = 0; i < itemsControl.ItemCount; i++)
63+
{
64+
var container = itemsControl.ContainerFromIndex(i);
65+
if (container != null)
66+
{
67+
container.Theme = themeSelector.SelectTheme(itemsControl.Items[i], container);
68+
}
69+
}
70+
}
71+
}

src/Avalonia/HandyControl_Avalonia/Controls/Attach/TitleElement.cs

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ namespace HandyControl.Controls;
55

66
public class TitleElement
77
{
8+
public static readonly AttachedProperty<IBrush?> BorderBrushProperty =
9+
AvaloniaProperty.RegisterAttached<TitleElement, AvaloniaObject, IBrush?>("BorderBrush", inherits: true);
10+
11+
public static void SetBorderBrush(AvaloniaObject element, IBrush? value) =>
12+
element.SetValue(BorderBrushProperty, value);
13+
14+
public static IBrush? GetBorderBrush(AvaloniaObject element) => element.GetValue(BorderBrushProperty);
15+
816
public static readonly AttachedProperty<IBrush?> BackgroundProperty =
917
AvaloniaProperty.RegisterAttached<TitleElement, AvaloniaObject, IBrush?>("Background", inherits: true);
1018

0 commit comments

Comments
 (0)