返回提交历史
Modified
XFEToolBox/Views/Controls/Carousel.xaml
+67
-17
Modified
XFEToolBox/Views/Controls/Carousel.xaml.cs
+65
-15
Modified
XFEToolBox/Views/Pages/MainPage.xaml.cs
+6
-7
Deleted
XFEToolBoxInstaller/Resources/Style/MyControlsStyle.xaml
+0
-409
XFEstudio/XFEToolBox
初步完善轮播图
e0dfb7a
代码差异
4 个文件
+138
-448
@@ -1,32 +1,82 @@
1
1
<UserControl x:Class="XFEToolBox.Views.Controls.Carousel"
2
2
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3
3
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
4
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6
6
xmlns:local="clr-namespace:XFEToolBox.Views.Controls"
7
7
mc:Ignorable="d"
8
d:DesignHeight="250" d:DesignWidth="600">
8
d:DesignHeight="280" d:DesignWidth="800">
9
9
<Grid>
10
10
<Grid.ColumnDefinitions>
11
<ColumnDefinition Width="50"/>
11
<ColumnDefinition Width="56"/>
12
12
<ColumnDefinition Width="*"/>
13
<ColumnDefinition Width="50"/>
13
<ColumnDefinition Width="56"/>
14
14
</Grid.ColumnDefinitions>
15
<Grid.RowDefinitions>
16
<RowDefinition Height="*"/>
17
<RowDefinition Height="30"/>
18
</Grid.RowDefinitions>
19
15
20
<!-- Main image -->
21
<Border Grid.Column="1" Grid.Row="0" CornerRadius="8" Background="LightGray" ClipToBounds="True" Margin="5">
22
<Image Stretch="UniformToFill" Source="{Binding CurrentImageSource, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
16
<!-- Left side bar column -->
17
<Border Grid.Column="0" Background="Transparent" Cursor="Hand" MouseLeftButtonUp="PrevButton_Click">
18
<Grid>
19
<Border Width="36" HorizontalAlignment="Center" VerticalAlignment="Stretch" CornerRadius="18" Background="#33FFFFFF" Margin="0,8"/>
20
<!-- Scalable left-pointing triangle, centered -->
21
<Path Width="12" Height="18" Stretch="Uniform" Fill="#333333" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M1,0 L0,0.5 L1,1 Z"/>
22
</Grid>
23
23
</Border>
24
24
25
<!-- Prev/Next buttons -->
26
<Button Grid.Column="0" Grid.Row="0" Width="36" Height="36" VerticalAlignment="Center" HorizontalAlignment="Center" Click="PrevButton_Click">◀</Button>
27
<Button Grid.Column="2" Grid.Row="0" Width="36" Height="36" VerticalAlignment="Center" HorizontalAlignment="Center" Click="NextButton_Click">▶</Button>
25
<!-- Center card column with rounded border and image -->
26
<Border Grid.Column="1" CornerRadius="12" Background="#F0EEF6" Padding="8">
27
<Grid>
28
<Image x:Name="PART_Image" Source="{Binding CurrentImageSource, RelativeSource={RelativeSource AncestorType=UserControl}}" Stretch="UniformToFill" ClipToBounds="True"/>
28
29
29
<!-- Simple position text -->
30
<TextBlock Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Gray" FontSize="12" Text="{Binding Path=PositionText, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
30
<!-- Bottom acrylic bar inside center card -->
31
<Border VerticalAlignment="Bottom" Margin="8" CornerRadius="8" Background="#CCFFFFFF" Height="64" Padding="12">
32
<Grid>
33
<Grid.ColumnDefinitions>
34
<ColumnDefinition Width="*"/>
35
<ColumnDefinition Width="Auto"/>
36
<ColumnDefinition Width="120"/>
37
</Grid.ColumnDefinitions>
38
39
<TextBlock x:Name="PART_Title" Grid.Column="0" Text="{Binding CurrentTitle, RelativeSource={RelativeSource AncestorType=UserControl}}" VerticalAlignment="Center" Foreground="#222" FontSize="16" FontWeight="SemiBold" TextTrimming="CharacterEllipsis"/>
40
41
<ItemsControl Grid.Column="1" ItemsSource="{Binding ImageList, RelativeSource={RelativeSource AncestorType=UserControl}}" HorizontalAlignment="Center" VerticalAlignment="Center">
42
<ItemsControl.ItemsPanel>
43
<ItemsPanelTemplate>
44
<StackPanel Orientation="Horizontal"/>
45
</ItemsPanelTemplate>
46
</ItemsControl.ItemsPanel>
47
<ItemsControl.ItemTemplate>
48
<DataTemplate>
49
<Border Background="Transparent" Padding="6" Cursor="Hand" MouseLeftButtonUp="Indicator_MouseLeftButtonUp">
50
<Ellipse Width="10" Height="10" Fill="#888" Opacity="0.5">
51
<Ellipse.Style>
52
<Style TargetType="Ellipse">
53
<Style.Triggers>
54
<DataTrigger Binding="{Binding IsSelected}" Value="True">
55
<Setter Property="Fill" Value="#6A5ACD"/>
56
<Setter Property="Opacity" Value="1"/>
57
<Setter Property="Width" Value="14"/>
58
<Setter Property="Height" Value="14"/>
59
</DataTrigger>
60
</Style.Triggers>
61
</Style>
62
</Ellipse.Style>
63
</Ellipse>
64
</Border>
65
</DataTemplate>
66
</ItemsControl.ItemTemplate>
67
</ItemsControl>
68
</Grid>
69
</Border>
70
</Grid>
71
</Border>
72
73
<!-- Right side bar column -->
74
<Border Grid.Column="2" Background="Transparent" Cursor="Hand" MouseLeftButtonUp="NextButton_Click">
75
<Grid>
76
<Border Width="36" HorizontalAlignment="Center" VerticalAlignment="Stretch" CornerRadius="18" Background="#33FFFFFF" Margin="0,8"/>
77
<!-- Scalable right-pointing triangle, centered -->
78
<Path Width="12" Height="18" Stretch="Uniform" Fill="#333333" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M0,0 L1,0.5 L0,1 Z"/>
79
</Grid>
80
</Border>
31
81
</Grid>
32
82
</UserControl>
@@ -2,10 +2,26 @@
2
2
using System.ComponentModel;
3
3
using System.Windows;
4
4
using System.Windows.Controls;
5
using System.Windows.Input;
5
6
using System.Windows.Media;
6
7
7
8
namespace XFEToolBox.Views.Controls;
8
9
10
public class CarouselImageItem : INotifyPropertyChanged
11
{
12
private ImageSource? image;
13
public ImageSource? Image { get => image; set { image = value; OnPropertyChanged(nameof(Image)); } }
14
15
private string title = string.Empty;
16
public string Title { get => title; set { title = value; OnPropertyChanged(nameof(Title)); } }
17
18
private bool isSelected = false;
19
public bool IsSelected { get => isSelected; set { isSelected = value; OnPropertyChanged(nameof(IsSelected)); } }
20
21
public event PropertyChangedEventHandler? PropertyChanged;
22
protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
23
}
24
9
25
/// <summary>
10
26
/// Carousel.xaml 的交互逻辑
11
27
/// </summary>
@@ -16,22 +32,22 @@ public partial class Carousel : UserControl, INotifyPropertyChanged
16
32
private System.Windows.Threading.DispatcherTimer? timer;
17
33
18
34
#region DependencyProperty
19
public ObservableCollection<ImageSource> ImageList
35
public ObservableCollection<CarouselImageItem> ImageList
20
36
{
21
get { return (ObservableCollection<ImageSource>)GetValue(ImageListProperty); }
37
get { return (ObservableCollection<CarouselImageItem>)GetValue(ImageListProperty); }
22
38
set { SetValue(ImageListProperty, value); }
23
39
}
24
40
25
41
public static readonly DependencyProperty ImageListProperty = DependencyProperty.Register(
26
"ImageList", typeof(ObservableCollection<ImageSource>), typeof(Carousel), new PropertyMetadata(new ObservableCollection<ImageSource>(), OnImageListChanged));
42
"ImageList", typeof(ObservableCollection<CarouselImageItem>), typeof(Carousel), new PropertyMetadata(new ObservableCollection<CarouselImageItem>(), OnImageListChanged));
27
43
28
44
private static void OnImageListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
29
45
{
30
46
if (d is Carousel c)
31
47
{
32
if (e.OldValue is ObservableCollection<ImageSource> old)
48
if (e.OldValue is ObservableCollection<CarouselImageItem> old)
33
49
old.CollectionChanged -= c.ImageList_CollectionChanged;
34
if (e.NewValue is ObservableCollection<ImageSource> neu)
50
if (e.NewValue is ObservableCollection<CarouselImageItem> neu)
35
51
neu.CollectionChanged += c.ImageList_CollectionChanged;
36
52
37
53
c.currentIndex = -1;
@@ -46,25 +62,29 @@ public partial class Carousel : UserControl, INotifyPropertyChanged
46
62
UpdateImage();
47
63
}
48
64
49
public ImageSource CurrentImageSource
65
public ImageSource? CurrentImageSource
50
66
{
51
get { return (ImageSource)GetValue(CurrentImageSourceProperty); }
67
get { return (ImageSource?)GetValue(CurrentImageSourceProperty); }
52
68
set { SetValue(CurrentImageSourceProperty, value); }
53
69
}
54
70
public static readonly DependencyProperty CurrentImageSourceProperty = DependencyProperty.Register("CurrentImageSource", typeof(ImageSource), typeof(Carousel), new PropertyMetadata(null));
55
71
56
public string PositionText
72
public string CurrentTitle
57
73
{
58
get { return (string)GetValue(PositionTextProperty); }
59
private set { SetValue(PositionTextProperty, value); }
74
get { return (string)GetValue(CurrentTitleProperty); }
75
set { SetValue(CurrentTitleProperty, value); }
60
76
}
61
public static readonly DependencyProperty PositionTextProperty = DependencyProperty.Register("PositionText", typeof(string), typeof(Carousel), new PropertyMetadata(string.Empty));
77
public static readonly DependencyProperty CurrentTitleProperty = DependencyProperty.Register("CurrentTitle", typeof(string), typeof(Carousel), new PropertyMetadata(string.Empty));
62
78
#endregion
63
79
64
80
public Carousel()
65
81
{
66
82
InitializeComponent();
67
83
84
// Ensure ImageList is not null
85
if (GetValue(ImageListProperty) == null)
86
ImageList = new ObservableCollection<CarouselImageItem>();
87
68
88
Loaded += Carousel_Loaded;
69
89
Unloaded += Carousel_Unloaded;
70
90
@@ -108,17 +128,23 @@ public partial class Carousel : UserControl, INotifyPropertyChanged
108
128
if (ImageList == null || ImageList.Count == 0)
109
129
{
110
130
CurrentImageSource = null;
111
PositionText = string.Empty;
131
CurrentTitle = string.Empty;
112
132
return;
113
133
}
114
134
115
135
if (currentIndex < 0)
116
136
currentIndex = 0;
117
137
118
CurrentImageSource = ImageList[currentIndex];
119
PositionText = $"{currentIndex + 1}/{ImageList.Count}";
138
for (int i = 0; i < ImageList.Count; i++)
139
{
140
ImageList[i].IsSelected = (i == currentIndex);
141
}
142
143
var item = ImageList[currentIndex];
144
CurrentImageSource = item?.Image;
145
CurrentTitle = item?.Title ?? string.Empty;
120
146
OnPropertyChanged(nameof(CurrentImageSource));
121
OnPropertyChanged(nameof(PositionText));
147
OnPropertyChanged(nameof(CurrentTitle));
122
148
}
123
149
124
150
private void PrevButton_Click(object sender, RoutedEventArgs e)
@@ -135,6 +161,30 @@ public partial class Carousel : UserControl, INotifyPropertyChanged
135
161
UpdateImage();
136
162
}
137
163
164
private void Indicator_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
165
{
166
if (sender is FrameworkElement fe && fe.DataContext is CarouselImageItem item)
167
{
168
var idx = ImageList.IndexOf(item);
169
if (idx >= 0)
170
{
171
currentIndex = idx;
172
UpdateImage();
173
}
174
}
175
}
176
177
// Public API helpers
178
public void AddItem(ImageSource image, string title)
179
{
180
ImageList.Add(new CarouselImageItem { Image = image, Title = title });
181
if (ImageList.Count == 1)
182
{
183
currentIndex = 0;
184
UpdateImage();
185
}
186
}
187
138
188
public event PropertyChangedEventHandler? PropertyChanged;
139
189
protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
140
190
}
@@ -1,6 +1,5 @@
1
1
using System.Windows.Controls;
2
2
using System.Windows.Media;
3
using System.Windows.Media.Imaging;
4
3
using XFEToolBox.Views.Controls;
5
4
6
5
namespace XFEToolBox.Views.Pages;
@@ -26,31 +25,31 @@ public partial class MainPage : Page
26
25
for (int i = 1; i <= 4; i++)
27
26
{
28
27
var img = CreatePlaceholderImage($"示例 {i}", 800, 450);
29
carousel.ImageList.Add(img);
28
carousel.AddItem(img, $"示例 {i}");
30
29
}
31
30
}
32
31
}
33
32
34
33
private ImageSource CreatePlaceholderImage(string text, int width, int height)
35
34
{
36
var dv = new DrawingVisual();
35
var dv = new System.Windows.Media.DrawingVisual();
37
36
using (var dc = dv.RenderOpen())
38
37
{
39
38
// Background
40
var brush = new LinearGradientBrush(Color.FromRgb(240, 240, 240), Color.FromRgb(200, 200, 255), 45);
39
var brush = new System.Windows.Media.LinearGradientBrush(System.Windows.Media.Color.FromRgb(245, 245, 250), System.Windows.Media.Color.FromRgb(220, 220, 255), 45);
41
40
dc.DrawRectangle(brush, null, new System.Windows.Rect(0, 0, width, height));
42
41
43
42
// Centered text
44
var formatted = new FormattedText(text,
43
var formatted = new System.Windows.Media.FormattedText(text,
45
44
System.Globalization.CultureInfo.CurrentCulture,
46
45
System.Windows.FlowDirection.LeftToRight,
47
new Typeface("Segoe UI"), 48, Brushes.Gray, 1.0);
46
new System.Windows.Media.Typeface("Segoe UI"), 48, System.Windows.Media.Brushes.Gray, 1.0);
48
47
49
48
var pt = new System.Windows.Point((width - formatted.Width) / 2, (height - formatted.Height) / 2);
50
49
dc.DrawText(formatted, pt);
51
50
}
52
51
53
var bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
52
var bmp = new System.Windows.Media.Imaging.RenderTargetBitmap(width, height, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
54
53
bmp.Render(dv);
55
54
bmp.Freeze();
56
55
return bmp;
@@ -1,409 +0,0 @@
1
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3
xmlns:ctr="clr-namespace:XFEToolBox.Views.Controls">
4
<Style TargetType="{x:Type ctr:RoundButton}">
5
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
6
<Setter Property="Template">
7
<Setter.Value>
8
<ControlTemplate TargetType="{x:Type ctr:RoundButton}">
9
<Grid>
10
<Border x:Name="backBorder" CornerRadius="{TemplateBinding RoundCornerRadius}" Background="{TemplateBinding RoundButtonBackground}" Opacity="0"/>
11
<Border CornerRadius="{TemplateBinding RoundCornerRadius}" BorderBrush="{TemplateBinding RoundButtonBorderBrush}" BorderThickness="{TemplateBinding RoundButtonBorderThickness}">
12
<ContentPresenter Content="{TemplateBinding Content}"/>
13
</Border>
14
</Grid>
15
<ControlTemplate.Triggers>
16
<EventTrigger RoutedEvent="MouseEnter">
17
<BeginStoryboard>
18
<Storyboard>
19
<DoubleAnimation Storyboard.TargetName="backBorder" Storyboard.TargetProperty="Opacity" To="0.1" Duration="0:0:0.3">
20
<DoubleAnimation.EasingFunction>
21
<CubicEase EasingMode="EaseOut"/>
22
</DoubleAnimation.EasingFunction>
23
</DoubleAnimation>
24
</Storyboard>
25
</BeginStoryboard>
26
</EventTrigger>
27
<EventTrigger RoutedEvent="MouseLeave">
28
<BeginStoryboard>
29
<Storyboard>
30
<DoubleAnimation Storyboard.TargetName="backBorder" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.3">
31
<DoubleAnimation.EasingFunction>
32
<CubicEase EasingMode="EaseOut"/>
33
</DoubleAnimation.EasingFunction>
34
</DoubleAnimation>
35
</Storyboard>
36
</BeginStoryboard>
37
</EventTrigger>
38
<EventTrigger RoutedEvent="PreviewMouseLeftButtonDown">
39
<BeginStoryboard>
40
<Storyboard>
41
<DoubleAnimation Storyboard.TargetName="backBorder" Storyboard.TargetProperty="Opacity" To="0.3" Duration="0:0:0.3">
42
<DoubleAnimation.EasingFunction>
43
<CubicEase EasingMode="EaseOut"/>
44
</DoubleAnimation.EasingFunction>
45
</DoubleAnimation>
46
</Storyboard>
47
</BeginStoryboard>
48
</EventTrigger>
49
<EventTrigger RoutedEvent="PreviewMouseLeftButtonUp">
50
<BeginStoryboard>
51
<Storyboard>
52
<DoubleAnimation Storyboard.TargetName="backBorder" Storyboard.TargetProperty="Opacity" To="0.1" Duration="0:0:0.3">
53
<DoubleAnimation.EasingFunction>
54
<CubicEase EasingMode="EaseOut"/>
55
</DoubleAnimation.EasingFunction>
56
</DoubleAnimation>
57
</Storyboard>
58
</BeginStoryboard>
59
</EventTrigger>
60
</ControlTemplate.Triggers>
61
</ControlTemplate>
62
</Setter.Value>
63
</Setter>
64
</Style>
65
<Style TargetType="{x:Type ctr:SwitchButton}">
66
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
67
<Setter Property="IsTabStop" Value="False"/>
68
<Setter Property="Margin" Value="0,10"/>
69
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
70
<Setter Property="Template">
71
<Setter.Value>
72
<ControlTemplate TargetType="ToggleButton">
73
<Grid>
74
<Grid.ColumnDefinitions>
75
<ColumnDefinition Width="32"/>
76
<ColumnDefinition Width="*"/>
77
</Grid.ColumnDefinitions>
78
<Grid x:Name="buttonGrid" Width="32" Height="17">
79
<Border x:Name="outBorder" BorderBrush="{DynamicResource MainColor}" BorderThickness="1.5" Width="32" Height="17" CornerRadius="8" VerticalAlignment="Center" HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5">
80
<Border.Background>
81
<SolidColorBrush x:Name="backgroundBursh" Color="White"/>
82
</Border.Background>
83
</Border>
84
<Border x:Name="switchBorder" Width="14.5" Height="14.5" Background="White" CornerRadius="20" BorderBrush="Gray" BorderThickness="1" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="1,0,0,0" RenderTransformOrigin="0.5,0.5">
85
<Border.RenderTransform>
86
<TranslateTransform x:Name="borderTransform" X="0" Y="0"/>
87
</Border.RenderTransform>
88
</Border>
89
</Grid>
90
<ContentPresenter x:Name="content" Grid.Column="1" Opacity="0.5" Margin="10,0,0,0"/>
91
</Grid>
92
<ControlTemplate.Triggers>
93
<EventTrigger RoutedEvent="MouseEnter" SourceName="buttonGrid">
94
<BeginStoryboard>
95
<Storyboard>
96
<ThicknessAnimation Storyboard.TargetName="switchBorder" Storyboard.TargetProperty="BorderThickness" To="0.5" Duration="0:0:0.3">
97
<ThicknessAnimation.EasingFunction>
98
<CubicEase EasingMode="EaseOut"/>
99
</ThicknessAnimation.EasingFunction>
100
</ThicknessAnimation>
101
</Storyboard>
102
</BeginStoryboard>
103
</EventTrigger>
104
<EventTrigger RoutedEvent="MouseLeave" SourceName="buttonGrid">
105
<BeginStoryboard>
106
<Storyboard>
107
<ThicknessAnimation Storyboard.TargetName="switchBorder" Storyboard.TargetProperty="BorderThickness" To="1" Duration="0:0:0.3">
108
<ThicknessAnimation.EasingFunction>
109
<CubicEase EasingMode="EaseOut"/>
110
</ThicknessAnimation.EasingFunction>
111
</ThicknessAnimation>
112
</Storyboard>
113
</BeginStoryboard>
114
</EventTrigger>
115
<EventTrigger RoutedEvent="Checked">
116
<BeginStoryboard>
117
<Storyboard>
118
<DoubleAnimation Storyboard.TargetName="borderTransform" Storyboard.TargetProperty="X" From="0" To="15" Duration="0:0:0.3">
119
<DoubleAnimation.EasingFunction>
120
<CubicEase EasingMode="EaseOut"/>
121
</DoubleAnimation.EasingFunction>
122
</DoubleAnimation>
123
<DoubleAnimation Storyboard.TargetName="content" Storyboard.TargetProperty="Opacity" From="0.5" To="1" Duration="0:0:0.3">
124
<DoubleAnimation.EasingFunction>
125
<CubicEase EasingMode="EaseOut"/>
126
</DoubleAnimation.EasingFunction>
127
</DoubleAnimation>
128
<ColorAnimation Storyboard.TargetName="backgroundBursh" Storyboard.TargetProperty="Color" From="White" To="#9898e7" Duration="0:0:0.3">
129
<ColorAnimation.EasingFunction>
130
<CubicEase EasingMode="EaseOut"/>
131
</ColorAnimation.EasingFunction>
132
</ColorAnimation>
133
</Storyboard>
134
</BeginStoryboard>
135
</EventTrigger>
136
<EventTrigger RoutedEvent="Unchecked">
137
<BeginStoryboard>
138
<Storyboard>
139
<DoubleAnimation Storyboard.TargetName="borderTransform" Storyboard.TargetProperty="X" From="15" To="0" Duration="0:0:0.3">
140
<DoubleAnimation.EasingFunction>
141
<CubicEase EasingMode="EaseOut"/>
142
</DoubleAnimation.EasingFunction>
143
</DoubleAnimation>
144
<DoubleAnimation Storyboard.TargetName="content" Storyboard.TargetProperty="Opacity" From="1" To="0.5" Duration="0:0:0.3">
145
<DoubleAnimation.EasingFunction>
146
<CubicEase EasingMode="EaseOut"/>
147
</DoubleAnimation.EasingFunction>
148
</DoubleAnimation>
149
<ColorAnimation Storyboard.TargetName="backgroundBursh" Storyboard.TargetProperty="Color" From="#9898e7" To="White" Duration="0:0:0.3">
150
<ColorAnimation.EasingFunction>
151
<CubicEase EasingMode="EaseOut"/>
152
</ColorAnimation.EasingFunction>
153
</ColorAnimation>
154
</Storyboard>
155
</BeginStoryboard>
156
</EventTrigger>
157
</ControlTemplate.Triggers>
158
</ControlTemplate>
159
</Setter.Value>
160
</Setter>
161
</Style>
162
<Style TargetType="{x:Type ctr:TabUnderLineButton}">
163
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
164
<Setter Property="IsTabStop" Value="False"/>
165
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
166
<Setter Property="Margin" Value="10,0"/>
167
<Setter Property="Template">
168
<Setter.Value>
169
<ControlTemplate TargetType="RadioButton">
170
<Grid>
171
<Grid.RowDefinitions>
172
<RowDefinition Height="Auto"/>
173
<RowDefinition Height="4"/>
174
</Grid.RowDefinitions>
175
<ContentPresenter x:Name="content" Opacity="0.5"/>
176
<Border x:Name="tagBorder" Background="{DynamicResource MainColor}" Grid.Row="1" CornerRadius="3" Height="4" Width="0"/>
177
<Border x:Name="tipBorder" Background="{DynamicResource MainColor}" Grid.Row="1" CornerRadius="20" Width="4" Height="4" Opacity="0"/>
178
</Grid>
179
<ControlTemplate.Triggers>
180
<EventTrigger RoutedEvent="MouseEnter">
181
<BeginStoryboard>
182
<Storyboard>
183
<DoubleAnimation Storyboard.TargetName="tipBorder" Storyboard.TargetProperty="Opacity" From="0" To="0.8" Duration="0:0:0.3">
184
<DoubleAnimation.EasingFunction>
185
<CubicEase EasingMode="EaseOut"/>
186
</DoubleAnimation.EasingFunction>
187
</DoubleAnimation>
188
</Storyboard>
189
</BeginStoryboard>
190
</EventTrigger>
191
<EventTrigger RoutedEvent="MouseLeave">
192
<BeginStoryboard>
193
<Storyboard>
194
<DoubleAnimation Storyboard.TargetName="tipBorder" Storyboard.TargetProperty="Opacity" From="0.8" To="0" Duration="0:0:0.3">
195
<DoubleAnimation.EasingFunction>
196
<CubicEase EasingMode="EaseOut"/>
197
</DoubleAnimation.EasingFunction>
198
</DoubleAnimation>
199
</Storyboard>
200
</BeginStoryboard>
201
</EventTrigger>
202
<EventTrigger RoutedEvent="Checked">
203
<BeginStoryboard>
204
<Storyboard>
205
<DoubleAnimation Storyboard.TargetName="tagBorder" Storyboard.TargetProperty="Width" From="0" To="20" Duration="0:0:0.3">
206
<DoubleAnimation.EasingFunction>
207
<CubicEase EasingMode="EaseOut"/>
208
</DoubleAnimation.EasingFunction>
209
</DoubleAnimation>
210
<DoubleAnimation Storyboard.TargetName="content" Storyboard.TargetProperty="Opacity" From="0.5" To="1" Duration="0:0:0.3">
211
<DoubleAnimation.EasingFunction>
212
<CubicEase EasingMode="EaseOut"/>
213
</DoubleAnimation.EasingFunction>
214
</DoubleAnimation>
215
</Storyboard>
216
</BeginStoryboard>
217
</EventTrigger>
218
<EventTrigger RoutedEvent="Unchecked">
219
<BeginStoryboard>
220
<Storyboard>
221
<DoubleAnimation Storyboard.TargetName="tagBorder" Storyboard.TargetProperty="Width" From="20" To="0" Duration="0:0:0.3">
222
<DoubleAnimation.EasingFunction>
223
<CubicEase EasingMode="EaseOut"/>
224
</DoubleAnimation.EasingFunction>
225
</DoubleAnimation>
226
<DoubleAnimation Storyboard.TargetName="content" Storyboard.TargetProperty="Opacity" From="1" To="0.5" Duration="0:0:0.3">
227
<DoubleAnimation.EasingFunction>
228
<CubicEase EasingMode="EaseOut"/>
229
</DoubleAnimation.EasingFunction>
230
</DoubleAnimation>
231
</Storyboard>
232
</BeginStoryboard>
233
</EventTrigger>
234
</ControlTemplate.Triggers>
235
</ControlTemplate>
236
</Setter.Value>
237
</Setter>
238
</Style>
239
<Style TargetType="{x:Type ctr:NavigationButton}">
240
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
241
<Setter Property="IsTabStop" Value="False"/>
242
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
243
<Setter Property="Margin" Value="10,0"/>
244
<Setter Property="Template">
245
<Setter.Value>
246
<ControlTemplate TargetType="RadioButton">
247
<Border x:Name="outBorder" Height="50" Background="{DynamicResource BackgroundColor}">
248
<Border x:Name="mainBorder" CornerRadius="15" Height="40" HorizontalAlignment="Stretch" Background="{DynamicResource BackgroundColor}" BorderBrush="#9898e7" BorderThickness="1.5" RenderTransformOrigin="0.5,0.5">
249
<Border.RenderTransform>
250
<ScaleTransform x:Name="mainBorderScale" ScaleX="1" ScaleY="1"/>
251
</Border.RenderTransform>
252
<Border.Effect>
253
<DropShadowEffect x:Name="mainBorderShadow" Color="#9898e7" BlurRadius="8" ShadowDepth="3" Direction="-45" Opacity="0"/>
254
</Border.Effect>
255
<Grid>
256
<Grid.ColumnDefinitions>
257
<ColumnDefinition Width="40"/>
258
<ColumnDefinition Width="10"/>
259
<ColumnDefinition Width="*"/>
260
</Grid.ColumnDefinitions>
261
<Border x:Name="borderSplit" Grid.Column="1" Background="{DynamicResource MainColor}" CornerRadius="2" Width="3" Opacity="0.5" HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="0,5"/>
262
<ContentPresenter Grid.ColumnSpan="3"/>
263
</Grid>
264
</Border>
265
</Border>
266
<ControlTemplate.Triggers>
267
<EventTrigger RoutedEvent="MouseEnter">
268
<BeginStoryboard>
269
<Storyboard>
270
<DoubleAnimation Storyboard.TargetName="mainBorderScale" Storyboard.TargetProperty="ScaleX" From="1" To="1.1" Duration="0:0:0.3">
271
<DoubleAnimation.EasingFunction>
272
<CubicEase EasingMode="EaseOut"/>
273
</DoubleAnimation.EasingFunction>
274
</DoubleAnimation>
275
<DoubleAnimation Storyboard.TargetName="mainBorderScale" Storyboard.TargetProperty="ScaleY" From="1" To="1.1" Duration="0:0:0.3">
276
<DoubleAnimation.EasingFunction>
277
<CubicEase EasingMode="EaseOut"/>
278
</DoubleAnimation.EasingFunction>
279
</DoubleAnimation>
280
<DoubleAnimation Storyboard.TargetName="outBorder" Storyboard.TargetProperty="Height" From="50" To="70" Duration="0:0:0.3">
281
<DoubleAnimation.EasingFunction>
282
<CubicEase EasingMode="EaseOut"/>
283
</DoubleAnimation.EasingFunction>
284
</DoubleAnimation>
285
</Storyboard>
286
</BeginStoryboard>
287
</EventTrigger>
288
<EventTrigger RoutedEvent="MouseLeave">
289
<BeginStoryboard>
290
<Storyboard>
291
<DoubleAnimation Storyboard.TargetName="mainBorderScale" Storyboard.TargetProperty="ScaleX" From="1.1" To="1" Duration="0:0:0.3">
292
<DoubleAnimation.EasingFunction>
293
<CubicEase EasingMode="EaseOut"/>
294
</DoubleAnimation.EasingFunction>
295
</DoubleAnimation>
296
<DoubleAnimation Storyboard.TargetName="mainBorderScale" Storyboard.TargetProperty="ScaleY" From="1.1" To="1" Duration="0:0:0.3">
297
<DoubleAnimation.EasingFunction>
298
<CubicEase EasingMode="EaseOut"/>
299
</DoubleAnimation.EasingFunction>
300
</DoubleAnimation>
301
<DoubleAnimation Storyboard.TargetName="outBorder" Storyboard.TargetProperty="Height" From="70" To="50" Duration="0:0:0.3">
302
<DoubleAnimation.EasingFunction>
303
<CubicEase EasingMode="EaseOut"/>
304
</DoubleAnimation.EasingFunction>
305
</DoubleAnimation>
306
</Storyboard>
307
</BeginStoryboard>
308
</EventTrigger>
309
<EventTrigger RoutedEvent="Checked">
310
<BeginStoryboard>
311
<Storyboard>
312
<DoubleAnimation Storyboard.TargetName="mainBorderShadow" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.3">
313
<DoubleAnimation.EasingFunction>
314
<CubicEase EasingMode="EaseOut"/>
315
</DoubleAnimation.EasingFunction>
316
</DoubleAnimation>
317
<DoubleAnimation Storyboard.TargetName="borderSplit" Storyboard.TargetProperty="Opacity" From="0.5" To="1" Duration="0:0:0.3">
318
<DoubleAnimation.EasingFunction>
319
<CubicEase EasingMode="EaseOut"/>
320
</DoubleAnimation.EasingFunction>
321
</DoubleAnimation>
322
</Storyboard>
323
</BeginStoryboard>
324
</EventTrigger>
325
<EventTrigger RoutedEvent="Unchecked">
326
<BeginStoryboard>
327
<Storyboard>
328
<DoubleAnimation Storyboard.TargetName="mainBorderShadow" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:0.3">
329
<DoubleAnimation.EasingFunction>
330
<CubicEase EasingMode="EaseOut"/>
331
</DoubleAnimation.EasingFunction>
332
</DoubleAnimation>
333
<DoubleAnimation Storyboard.TargetName="borderSplit" Storyboard.TargetProperty="Opacity" From="1" To="0.5" Duration="0:0:0.3">
334
<DoubleAnimation.EasingFunction>
335
<CubicEase EasingMode="EaseOut"/>
336
</DoubleAnimation.EasingFunction>
337
</DoubleAnimation>
338
</Storyboard>
339
</BeginStoryboard>
340
</EventTrigger>
341
</ControlTemplate.Triggers>
342
</ControlTemplate>
343
</Setter.Value>
344
</Setter>
345
</Style>
346
<Style TargetType="{x:Type ctr:HintTextBox}">
347
<Setter Property="Template">
348
<Setter.Value>
349
<ControlTemplate TargetType="{x:Type ctr:HintTextBox}">
350
<TextBox x:Name="mainTextBox" BorderThickness="{TemplateBinding BorderThickness}" Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Foreground="{TemplateBinding Foreground}" CaretBrush="{TemplateBinding CaretBrush}" SelectionBrush="{TemplateBinding SelectionBrush}" SelectionTextBrush="{TemplateBinding SelectionTextBrush}" IsReadOnly="{TemplateBinding IsReadOnly}" IsReadOnlyCaretVisible="{TemplateBinding IsReadOnlyCaretVisible}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalScrollBarVisibility="{TemplateBinding HorizontalScrollBarVisibility}" VerticalScrollBarVisibility="{TemplateBinding VerticalScrollBarVisibility}" AcceptsReturn="{TemplateBinding AcceptsReturn}" AcceptsTab="{TemplateBinding AcceptsTab}" IsEnabled="{TemplateBinding IsEnabled}" IsInactiveSelectionHighlightEnabled="{TemplateBinding IsInactiveSelectionHighlightEnabled}" UndoLimit="{TemplateBinding UndoLimit}" IsUndoEnabled="{TemplateBinding IsUndoEnabled}" TextWrapping="{TemplateBinding TextWrapping}" TextAlignment="{TemplateBinding TextAlignment}" TextDecorations="{TemplateBinding TextDecorations}">
351
<TextBox.Background>
352
<VisualBrush TileMode="None" Stretch="None" AlignmentX="Left">
353
<VisualBrush.Visual>
354
<TextBlock x:Name="hintTextBlock" Background="{TemplateBinding HintBackground}" Foreground="{TemplateBinding HintForeground}" Text="{TemplateBinding HintText}" FontSize="{TemplateBinding HintFontSize}" FontFamily="{TemplateBinding HintFontFamily}" FontWeight="{TemplateBinding HintFontWeight}" HorizontalAlignment="{TemplateBinding HintTextHorizontalAlignment}" VerticalAlignment="{TemplateBinding HintTextVerticalAlignment}" Margin="{TemplateBinding HintTextMargin}" Opacity="{TemplateBinding HintTextOpacity}" Visibility="Hidden"/>
355
</VisualBrush.Visual>
356
</VisualBrush>
357
</TextBox.Background>
358
</TextBox>
359
<ControlTemplate.Triggers>
360
<Trigger SourceName="mainTextBox" Property="Text" Value="">
361
<Setter TargetName="hintTextBlock" Property="Visibility" Value="Visible"/>
362
</Trigger>
363
<Trigger SourceName="mainTextBox" Property="Text" Value="{x:Null}">
364
<Setter TargetName="hintTextBlock" Property="Visibility" Value="Visible"/>
365
</Trigger>
366
</ControlTemplate.Triggers>
367
</ControlTemplate>
368
</Setter.Value>
369
</Setter>
370
</Style>
371
<Style TargetType="{x:Type ctr:TextEditor}">
372
<Setter Property="Template">
373
<Setter.Value>
374
<ControlTemplate TargetType="{x:Type ctr:TextEditor}">
375
<Border Padding="{TemplateBinding Padding}" CornerRadius="{TemplateBinding EditorCornerRadius}" BorderBrush="{TemplateBinding EditorBorderBrush}" BorderThickness="{TemplateBinding EditorBorderThickness}" Background="{TemplateBinding Background}">
376
<ctr:HintTextBox BorderThickness="0" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" HintBackground="{TemplateBinding HintBackground}" Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HintForeground="{TemplateBinding HintForeground}" HintText="{TemplateBinding HintText}" HintFontSize="{TemplateBinding HintFontSize}" HintFontFamily="{TemplateBinding HintFontFamily}" HintFontWeight="{TemplateBinding HintFontWeight}" HintTextHorizontalAlignment="{TemplateBinding HintTextHorizontalAlignment}" HintTextVerticalAlignment="{TemplateBinding HintTextVerticalAlignment}" HintTextMargin="{TemplateBinding HintTextMargin}" HintTextOpacity="{TemplateBinding HintTextOpacity}" CaretBrush="{TemplateBinding CaretBrush}" SelectionBrush="{TemplateBinding SelectionBrush}" SelectionTextBrush="{TemplateBinding SelectionTextBrush}" IsReadOnly="{TemplateBinding IsReadOnly}" IsReadOnlyCaretVisible="{TemplateBinding IsReadOnlyCaretVisible}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalScrollBarVisibility="{TemplateBinding HorizontalScrollBarVisibility}" VerticalScrollBarVisibility="{TemplateBinding VerticalScrollBarVisibility}" AcceptsReturn="{TemplateBinding AcceptsReturn}" AcceptsTab="{TemplateBinding AcceptsTab}" IsEnabled="{TemplateBinding IsEnabled}" IsInactiveSelectionHighlightEnabled="{TemplateBinding IsInactiveSelectionHighlightEnabled}" UndoLimit="{TemplateBinding UndoLimit}" IsUndoEnabled="{TemplateBinding IsUndoEnabled}" TextWrapping="{TemplateBinding TextWrapping}" TextAlignment="{TemplateBinding TextAlignment}" TextDecorations="{TemplateBinding TextDecorations}"/>
377
</Border>
378
</ControlTemplate>
379
</Setter.Value>
380
</Setter>
381
</Style>
382
<Style TargetType="{x:Type ctr:CheckButton}">
383
<Setter Property="Template">
384
<Setter.Value>
385
<ControlTemplate TargetType="{x:Type ctr:CheckButton}">
386
<Grid x:Name="mainGrid">
387
<Grid.ColumnDefinitions>
388
<ColumnDefinition Width="25"/>
389
<ColumnDefinition Width="*"/>
390
</Grid.ColumnDefinitions>
391
<Grid>
392
<Border CornerRadius="20" Width="20" Height="20" HorizontalAlignment="Center" VerticalAlignment="Center" Background="Transparent" BorderBrush="{DynamicResource MainColor}" BorderThickness="2"/>
393
<Image x:Name="checkImage" Source="/Resources/Image/check.png" Visibility="Hidden"/>
394
</Grid>
395
<ContentPresenter Grid.Column="1"/>
396
</Grid>
397
<ControlTemplate.Triggers>
398
<Trigger Property="IsChecked" Value="True">
399
<Setter TargetName="checkImage" Property="Visibility" Value="Visible"/>
400
</Trigger>
401
<Trigger Property="IsEnabled" Value="False">
402
<Setter TargetName="mainGrid" Property="Opacity" Value="0.5"/>
403
</Trigger>
404
</ControlTemplate.Triggers>
405
</ControlTemplate>
406
</Setter.Value>
407
</Setter>
408
</Style>
409
</ResourceDictionary>