XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEToolBox

初步完善轮播图

e0dfb7a
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

4 个文件 +138 -448
Modified XFEToolBox/Views/Controls/Carousel.xaml +67 -17
@@ -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>
Modified XFEToolBox/Views/Controls/Carousel.xaml.cs +65 -15
@@ -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 }
Modified XFEToolBox/Views/Pages/MainPage.xaml.cs +6 -7
@@ -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;
Deleted XFEToolBoxInstaller/Resources/Style/MyControlsStyle.xaml +0 -409
@@ -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>