improve growl

According to @ghost1372  suggestion, growl has been improved.
This commit is contained in:
NaBian committed 2018-10-24 14:20:42 +08:00
1 parent fffbdbb4a9
commit b144c2ec39
33 files changed
+409 -77

No files matched your search

+2 -2
View File
@@ -4,6 +4,6 @@
/HandyControl/obj /HandyControl/obj
/HandyControlDemo/bin /HandyControlDemo/bin
/HandyControlDemo/obj /HandyControlDemo/obj
/DockContainerResearch/bin /DockBoxResearch/bin
/DockContainerResearch/obj /DockBoxResearch/obj
/HandyControl.sln.DotSettings.user /HandyControl.sln.DotSettings.user
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1 -1
View File
@@ -7,7 +7,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandyControl", "HandyContro
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandyControlDemo", "HandyControlDemo\HandyControlDemo.csproj", "{9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandyControlDemo", "HandyControlDemo\HandyControlDemo.csproj", "{9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DockBoxResearch", "DockContainerResearch\DockBoxResearch.csproj", "{8A444D0A-E3DD-446F-95C4-0A132179D20F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DockBoxResearch", "DockBoxResearch\DockBoxResearch.csproj", "{8A444D0A-E3DD-446F-95C4-0A132179D20F}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
+4 -3
View File
@@ -10,6 +10,7 @@ using System.Windows.Input;
using System.Windows.Markup; using System.Windows.Markup;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using HandyControl.Data;
using HandyControl.Interactivity; using HandyControl.Interactivity;
using HandyControl.Tools; using HandyControl.Tools;
@@ -268,7 +269,7 @@ namespace HandyControl.Controls
{ {
var button = new Button var button = new Button
{ {
Style = TryFindResource("ButtonCustom") as Style, Style = ResourceHelper.GetResource<Style>(ResourceToken.ButtonCustom),
Content = new Border Content = new Border
{ {
Width = 10, Width = 10,
@@ -277,7 +278,7 @@ namespace HandyControl.Controls
Background = Brushes.White, Background = Brushes.White,
Margin = new Thickness(5, 0, 5, 0), Margin = new Thickness(5, 0, 5, 0),
BorderThickness = new Thickness(1), BorderThickness = new Thickness(1),
BorderBrush = TryFindResource("PrimaryBrush") as Brush BorderBrush = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryBrush)
} }
}; };
return button; return button;
@@ -289,7 +290,7 @@ namespace HandyControl.Controls
borderOri.Background = Brushes.White; borderOri.Background = Brushes.White;
_selectedButton = e.OriginalSource as Button; _selectedButton = e.OriginalSource as Button;
if (_selectedButton != null && _selectedButton.Content is Border border) if (_selectedButton != null && _selectedButton.Content is Border border)
border.Background = TryFindResource("PrimaryBrush") as Brush; border.Background = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryBrush);
var index = _panelPage.Children.IndexOf(_selectedButton); var index = _panelPage.Children.IndexOf(_selectedButton);
if (index != -1) if (index != -1)
PageIndex = index; PageIndex = index;
+183 -34
View File
@@ -6,6 +6,8 @@ using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
using System.Windows.Threading; using System.Windows.Threading;
using HandyControl.Data;
using HandyControl.Data.Enum;
using HandyControl.Interactivity; using HandyControl.Interactivity;
using HandyControl.Tools; using HandyControl.Tools;
using HandyControl.Tools.Extension; using HandyControl.Tools.Extension;
@@ -78,18 +80,6 @@ namespace HandyControl.Controls
/// </summary> /// </summary>
private const int MaxTickCount = 6; private const int MaxTickCount = 6;
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(
"Message", typeof(string), typeof(Growl), new PropertyMetadata(default(string)));
public static readonly DependencyProperty TimeProperty = DependencyProperty.Register(
"Time", typeof(DateTime), typeof(Growl), new PropertyMetadata(default(DateTime)));
public static readonly DependencyProperty IconProperty = DependencyProperty.Register(
"Icon", typeof(Geometry), typeof(Growl), new PropertyMetadata(default(Geometry)));
public static readonly DependencyProperty IconBrushProperty = DependencyProperty.Register(
"IconBrush", typeof(Brush), typeof(Growl), new PropertyMetadata(default(Brush)));
/// <summary> /// <summary>
/// 消息容器 /// 消息容器
/// </summary> /// </summary>
@@ -107,6 +97,54 @@ namespace HandyControl.Controls
private Func<bool, bool> ActionBeforeClose { get; set; } private Func<bool, bool> ActionBeforeClose { get; set; }
internal static readonly DependencyProperty CancelStrProperty = DependencyProperty.Register(
"CancelStr", typeof(string), typeof(Growl), new PropertyMetadata(default(string)));
internal static readonly DependencyProperty ConfirmStrProperty = DependencyProperty.Register(
"ConfirmStr", typeof(string), typeof(Growl), new PropertyMetadata(default(string)));
public static readonly DependencyProperty ShowDateTimeProperty = DependencyProperty.Register(
"ShowDateTime", typeof(bool), typeof(Growl), new PropertyMetadata(true));
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register(
"Message", typeof(string), typeof(Growl), new PropertyMetadata(default(string)));
public static readonly DependencyProperty TimeProperty = DependencyProperty.Register(
"Time", typeof(DateTime), typeof(Growl), new PropertyMetadata(default(DateTime)));
public static readonly DependencyProperty IconProperty = DependencyProperty.Register(
"Icon", typeof(Geometry), typeof(Growl), new PropertyMetadata(default(Geometry)));
public static readonly DependencyProperty IconBrushProperty = DependencyProperty.Register(
"IconBrush", typeof(Brush), typeof(Growl), new PropertyMetadata(default(Brush)));
public static readonly DependencyProperty TypeProperty = DependencyProperty.Register(
"Type", typeof(InfoType), typeof(Growl), new PropertyMetadata(default(InfoType)));
public InfoType Type
{
get => (InfoType) GetValue(TypeProperty);
set => SetValue(TypeProperty, value);
}
internal string CancelStr
{
get => (string)GetValue(CancelStrProperty);
set => SetValue(CancelStrProperty, value);
}
internal string ConfirmStr
{
get => (string)GetValue(ConfirmStrProperty);
set => SetValue(ConfirmStrProperty, value);
}
public bool ShowDateTime
{
get => (bool)GetValue(ShowDateTimeProperty);
set => SetValue(ShowDateTimeProperty, value);
}
public string Message public string Message
{ {
get => (string)GetValue(MessageProperty); get => (string)GetValue(MessageProperty);
@@ -211,18 +249,22 @@ namespace HandyControl.Controls
/// <summary> /// <summary>
/// 显示信息 /// 显示信息
/// </summary> /// </summary>
private static void Show(string message, string iconKey, string iconBrushKey, Func<bool, bool> actionBeforeClose = null, /// <param name="growlInfo"></param>
bool staysOpen = false, bool showCloseButton = true) private static void Show(GrowlInfo growlInfo)
{ {
var ctl = new Growl var ctl = new Growl
{ {
Message = message, Message = growlInfo.Message,
Time = DateTime.Now, Time = DateTime.Now,
Icon = ResourceHelper.GetResource<Geometry>(iconKey), Icon = ResourceHelper.GetResource<Geometry>(growlInfo.IconKey),
IconBrush = ResourceHelper.GetResource<Brush>(iconBrushKey), IconBrush = ResourceHelper.GetResource<Brush>(growlInfo.IconBrushKey),
_showCloseButton = showCloseButton, _showCloseButton = growlInfo.ShowCloseButton,
ActionBeforeClose = actionBeforeClose, ActionBeforeClose = growlInfo.ActionBeforeClose,
_staysOpen = staysOpen _staysOpen = growlInfo.StaysOpen,
ShowDateTime = growlInfo.ShowDateTime,
ConfirmStr = growlInfo.ConfirmStr,
CancelStr = growlInfo.CancelStr,
Type = growlInfo.Type
}; };
GrowlPanel.Children.Insert(0, ctl); GrowlPanel.Children.Insert(0, ctl);
} }
@@ -230,38 +272,141 @@ namespace HandyControl.Controls
/// <summary> /// <summary>
/// 成功 /// 成功
/// </summary> /// </summary>
public static void Success(string message) => Show(message, "SuccessGeometry", "SuccessBrush"); /// <param name="message"></param>
public static void Success(string message) => Success(new GrowlInfo
{
Message = message
});
/// <summary>
/// 成功
/// </summary>
/// <param name="growlInfo"></param>
public static void Success(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.SuccessGeometry;
growlInfo.IconBrushKey = ResourceToken.SuccessBrush;
growlInfo.Type = InfoType.Success;
Show(growlInfo);
}
/// <summary> /// <summary>
/// 消息 /// 消息
/// </summary> /// </summary>
public static void Info(string message) => Show(message, "InfoGeometry", "InfoBrush"); /// <param name="message"></param>
public static void Info(string message) => Info(new GrowlInfo
{
Message = message
});
/// <summary> /// <summary>
/// 错误 /// 消息
/// </summary> /// </summary>
public static void Error(string message) => Show(message, "ErrorGeometry", "DangerBrush", null, true); /// <param name="growlInfo"></param>
public static void Info(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.InfoGeometry;
growlInfo.IconBrushKey = ResourceToken.InfoBrush;
growlInfo.Type = InfoType.Info;
Show(growlInfo);
}
/// <summary> /// <summary>
/// 警告 /// 警告
/// </summary> /// </summary>
public static void Warning(string message) => Show(message, "WarningGeometry", "WarningBrush"); /// <param name="message"></param>
public static void Warning(string message) => Warning(new GrowlInfo
{
Message = message
});
/// <summary>
/// 警告
/// </summary>
/// <param name="growlInfo"></param>
public static void Warning(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.WarningGeometry;
growlInfo.IconBrushKey = ResourceToken.WarningBrush;
growlInfo.Type = InfoType.Warning;
Show(growlInfo);
}
/// <summary>
/// 错误
/// </summary>
/// <param name="message"></param>
public static void Error(string message) => Error(new GrowlInfo
{
Message = message
});
/// <summary>
/// 错误
/// </summary>
/// <param name="growlInfo"></param>
public static void Error(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.ErrorGeometry;
growlInfo.IconBrushKey = ResourceToken.DangerBrush;
growlInfo.StaysOpen = true;
growlInfo.Type = InfoType.Error;
Show(growlInfo);
}
/// <summary> /// <summary>
/// 严重 /// 严重
/// </summary> /// </summary>
/// <param name="message"></param> /// <param name="message"></param>
/// <param name="showContextMenu"></param> public static void Fatal(string message) => Fatal(new GrowlInfo
public static void Fatal(string message, bool showContextMenu = true)
{ {
if (!showContextMenu) Message = message
{ });
GrowlPanel.ContextMenu.Collapse();
} /// <summary>
Show(message, "FatalGeometry", "PrimaryTextBrush", null, true, false); /// 严重
/// </summary>
/// <param name="growlInfo"></param>
public static void Fatal(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.FatalGeometry;
growlInfo.IconBrushKey = ResourceToken.PrimaryTextBrush;
growlInfo.StaysOpen = true;
growlInfo.ShowCloseButton = false;
growlInfo.Type = InfoType.Fatal;
// ReSharper disable once PossibleNullReferenceException
GrowlPanel.ContextMenu.Opacity = 0;
Show(growlInfo);
} }
public static void Ask(string message, Func<bool, bool> actionBeforeClose) => Show(message, "AskGeometry", "AccentBrush", actionBeforeClose); /// <summary>
/// 询问
/// </summary>
/// <param name="message"></param>
public static void Ask(string message) => Ask(new GrowlInfo
{
Message = message
});
/// <summary>
/// 询问
/// </summary>
/// <param name="growlInfo"></param>
public static void Ask(GrowlInfo growlInfo)
{
if (growlInfo == null) throw new NullReferenceException("growlInfo is null");
growlInfo.IconKey = ResourceToken.AskGeometry;
growlInfo.IconBrushKey = ResourceToken.AccentBrush;
growlInfo.StaysOpen = true;
growlInfo.ShowCloseButton = false;
growlInfo.Type = InfoType.Ask;
Show(growlInfo);
}
private void ButtonClose_OnClick(object sender, RoutedEventArgs e) => Close(); private void ButtonClose_OnClick(object sender, RoutedEventArgs e) => Close();
@@ -284,7 +429,11 @@ namespace HandyControl.Controls
public static void Clear() public static void Clear()
{ {
GrowlPanel.Children.Clear(); GrowlPanel.Children.Clear();
GrowlPanel.Show(); if (GrowlPanel.ContextMenu != null)
{
GrowlPanel.ContextMenu.IsOpen = false;
GrowlPanel.ContextMenu.Opacity = 1;
}
} }
private void ButtonCancel_OnClick(object sender, RoutedEventArgs e) private void ButtonCancel_OnClick(object sender, RoutedEventArgs e)
+7 -7
View File
@@ -29,8 +29,8 @@ namespace HandyControl.Controls
public bool IsRunning public bool IsRunning
{ {
get { return (bool) GetValue(IsRunningProperty); } get => (bool) GetValue(IsRunningProperty);
set { SetValue(IsRunningProperty, value); } set => SetValue(IsRunningProperty, value);
} }
public static readonly DependencyProperty DotCountProperty = DependencyProperty.Register( public static readonly DependencyProperty DotCountProperty = DependencyProperty.Register(
@@ -124,11 +124,11 @@ namespace HandyControl.Controls
protected Ellipse CreateEllipse(int index) protected Ellipse CreateEllipse(int index)
{ {
var ellipse = new Ellipse(); var ellipse = new Ellipse();
ellipse.SetBinding(WidthProperty, new Binding("DotDiameter") {Source = this}); ellipse.SetBinding(WidthProperty, new Binding(DotDiameterProperty.Name) {Source = this});
ellipse.SetBinding(HeightProperty, new Binding("DotDiameter") {Source = this}); ellipse.SetBinding(HeightProperty, new Binding(DotDiameterProperty.Name) {Source = this});
ellipse.SetBinding(Shape.FillProperty, new Binding("Foreground") {Source = this}); ellipse.SetBinding(Shape.FillProperty, new Binding(ForegroundProperty.Name) {Source = this});
ellipse.SetBinding(Shape.StrokeThicknessProperty, new Binding("DotBorderThickness") {Source = this}); ellipse.SetBinding(Shape.StrokeThicknessProperty, new Binding(DotBorderThicknessProperty.Name) {Source = this});
ellipse.SetBinding(Shape.StrokeProperty, new Binding("DotBorderBrush") {Source = this}); ellipse.SetBinding(Shape.StrokeProperty, new Binding(DotBorderBrushProperty.Name) {Source = this});
return ellipse; return ellipse;
} }
} }
+14 -13
View File
@@ -4,6 +4,7 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using HandyControl.Data; using HandyControl.Data;
using HandyControl.Interactivity; using HandyControl.Interactivity;
using HandyControl.Tools;
using HandyControl.Tools.Extension; using HandyControl.Tools.Extension;
namespace HandyControl.Controls namespace HandyControl.Controls
@@ -261,37 +262,37 @@ namespace HandyControl.Controls
_buttonRight.IsEnabled = PageIndex < MaxPageCount; _buttonRight.IsEnabled = PageIndex < MaxPageCount;
if (MaxPageInterval == 0) if (MaxPageInterval == 0)
{ {
_buttonFirst.Visibility = Visibility.Collapsed; _buttonFirst.Collapse();
_buttonLast.Visibility = Visibility.Collapsed; _buttonLast.Collapse();
_textBlockLeft.Visibility = Visibility.Collapsed; _textBlockLeft.Collapse();
_textBlockRight.Visibility = Visibility.Collapsed; _textBlockRight.Collapse();
_panelMain.Children.Clear(); _panelMain.Children.Clear();
var selectButton = CreateButton(PageIndex); var selectButton = CreateButton(PageIndex);
_panelMain.Children.Add(selectButton); _panelMain.Children.Add(selectButton);
selectButton.IsChecked = true; selectButton.IsChecked = true;
return; return;
} }
_buttonFirst.Visibility = Visibility.Visible; _buttonFirst.Show();
_buttonLast.Visibility = Visibility.Visible; _buttonLast.Show();
_textBlockLeft.Visibility = Visibility.Visible; _textBlockLeft.Show();
_textBlockRight.Visibility = Visibility.Visible; _textBlockRight.Show();
//更新最后一页 //更新最后一页
if (MaxPageCount == 1) if (MaxPageCount == 1)
{ {
_buttonLast.Visibility = Visibility.Collapsed; _buttonLast.Collapse();
} }
else else
{ {
_buttonLast.Visibility = Visibility.Visible; _buttonLast.Show();
_buttonLast.Tag = MaxPageCount.ToString(); _buttonLast.Tag = MaxPageCount.ToString();
} }
//更新省略号 //更新省略号
var right = MaxPageCount - PageIndex; var right = MaxPageCount - PageIndex;
var left = PageIndex - 1; var left = PageIndex - 1;
_textBlockRight.Visibility = right > MaxPageInterval ? Visibility.Visible : Visibility.Collapsed; _textBlockRight.Show(right > MaxPageInterval);
_textBlockLeft.Visibility = left > MaxPageInterval ? Visibility.Visible : Visibility.Collapsed; _textBlockLeft.Show(left > MaxPageInterval);
//更新中间部分 //更新中间部分
_panelMain.Children.Clear(); _panelMain.Children.Clear();
@@ -344,7 +345,7 @@ namespace HandyControl.Controls
{ {
return new RadioButton return new RadioButton
{ {
Style = FindResource("PaginationButtonStyle") as Style, Style = ResourceHelper.GetResource<Style>(ResourceToken.PaginationButtonStyle),
Tag = page.ToString() Tag = page.ToString()
}; };
} }
+4 -3
View File
@@ -1,6 +1,7 @@
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Media; using System.Windows.Media;
using HandyControl.Data;
using HandyControl.Tools; using HandyControl.Tools;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
@@ -54,15 +55,15 @@ namespace HandyControl.Controls
{ {
if (Status == true) if (Status == true)
{ {
Foreground = ResourceHelper.GetResource<Brush>("PrimaryTextBrush"); Foreground = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryTextBrush);
} }
else if (Status == false) else if (Status == false)
{ {
Foreground = ResourceHelper.GetResource<Brush>("PrimaryBrush"); Foreground = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryBrush);
} }
else else
{ {
Foreground = ResourceHelper.GetResource<Brush>("ThirdlyTextBrush"); Foreground = ResourceHelper.GetResource<Brush>(ResourceToken.ThirdlyTextBrush);
} }
} }
} }
@@ -534,8 +534,6 @@ namespace HandyControl.Controls
} }
} }
//private void ButtonScreenChange_OnClick(object sender, RoutedEventArgs e) => WindowState = IsFullScreen ? WindowState.Maximized : WindowState.Normal;
private void ButtonClose_OnClick(object sender, RoutedEventArgs e) => Close(); private void ButtonClose_OnClick(object sender, RoutedEventArgs e) => Close();
private void GridTop_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) private void GridTop_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+2 -1
View File
@@ -3,6 +3,7 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using HandyControl.Data;
using HandyControl.Interactivity; using HandyControl.Interactivity;
using HandyControl.Tools; using HandyControl.Tools;
@@ -188,7 +189,7 @@ namespace HandyControl.Controls
ContentStr = message, ContentStr = message,
WindowStartupLocation = WindowStartupLocation.CenterScreen WindowStartupLocation = WindowStartupLocation.CenterScreen
}; };
window.Background = window.FindResource("PrimaryBrush") as SolidColorBrush; window.Background = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryBrush);
window.Show(); window.Show();
} }
@@ -5,6 +5,8 @@ using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Shell; using System.Windows.Shell;
using HandyControl.Data;
using HandyControl.Tools;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
namespace HandyControl.Controls namespace HandyControl.Controls
@@ -258,14 +260,14 @@ namespace HandyControl.Controls
{ {
var window = new WindowBorderless var window = new WindowBorderless
{ {
Style = Application.Current.TryFindResource("CustomWindowStyle") as Style, Style = ResourceHelper.GetResource<Style>(ResourceToken.CustomWindowStyle),
Content = content Content = content
}; };
window.Loaded += (s, e) => window.Loaded += (s, e) =>
{ {
window.Width = window.BorderThickness.Left + window.BorderThickness.Right + content.Width; window.Width = window.BorderThickness.Left + window.BorderThickness.Right + content.Width;
if (!(window.Template.FindName("GridMenu", window) is Grid nemuArea)) if (!(window.Template.FindName("GridMenu", window) is Grid nemuArea))
throw new NullReferenceException("在样式中未找到名称为GridMenu的元素"); throw new NullReferenceException("can not find GridMenu in template");
window.Height = window.BorderThickness.Top + window.BorderThickness.Bottom + content.Height + window.Height = window.BorderThickness.Top + window.BorderThickness.Bottom + content.Height +
nemuArea.ActualHeight; nemuArea.ActualHeight;
}; };
+12
View File
@@ -0,0 +1,12 @@
namespace HandyControl.Data.Enum
{
public enum InfoType
{
Success = 0,
Info,
Warning,
Error,
Fatal,
Ask
}
}
+28
View File
@@ -0,0 +1,28 @@
using System;
using HandyControl.Data.Enum;
namespace HandyControl.Data
{
public class GrowlInfo
{
public string Message { get; set; }
public bool ShowDateTime { get; set; } = true;
public string CancelStr { get; set; } = Properties.Langs.Lang.Cancel;
public string ConfirmStr { get; set; } = Properties.Langs.Lang.Confirm;
public Func<bool, bool> ActionBeforeClose { get; set; }
internal InfoType Type { get; set; }
internal string IconKey { get; set; }
internal string IconBrushKey { get; set; }
internal bool StaysOpen { get; set; }
internal bool ShowCloseButton { get; set; } = true;
}
}
+40
View File
@@ -0,0 +1,40 @@
namespace HandyControl.Data
{
internal class ResourceToken
{
public static readonly string SuccessGeometry = nameof(SuccessGeometry);
public static readonly string InfoGeometry = nameof(InfoGeometry);
public static readonly string ErrorGeometry = nameof(ErrorGeometry);
public static readonly string WarningGeometry = nameof(WarningGeometry);
public static readonly string AskGeometry = nameof(AskGeometry);
public static readonly string FatalGeometry = nameof(FatalGeometry);
public static readonly string PrimaryBrush = nameof(PrimaryBrush);
public static readonly string SuccessBrush = nameof(SuccessBrush);
public static readonly string InfoBrush = nameof(InfoBrush);
public static readonly string DangerBrush = nameof(DangerBrush);
public static readonly string WarningBrush = nameof(WarningBrush);
public static readonly string AccentBrush = nameof(AccentBrush);
public static readonly string PrimaryTextBrush = nameof(PrimaryTextBrush);
public static readonly string ThirdlyTextBrush = nameof(ThirdlyTextBrush);
public static readonly string ButtonCustom = nameof(ButtonCustom);
public static readonly string PaginationButtonStyle = nameof(PaginationButtonStyle);
public static readonly string CustomWindowStyle = nameof(CustomWindowStyle);
}
}
+49
View File
@@ -0,0 +1,49 @@
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ import namespace="System.Collections.Generic"#>
<#@ output extension=".cs" #>
<#
var geometryList = new List<string>
{
"SuccessGeometry",
"InfoGeometry",
"ErrorGeometry",
"WarningGeometry",
"AskGeometry",
"FatalGeometry",
"PrimaryBrush"
};
var brushList = new List<string>
{
"SuccessBrush",
"InfoBrush",
"DangerBrush",
"WarningBrush",
"AccentBrush",
"PrimaryTextBrush",
"ThirdlyTextBrush"
};
var styleList = new List<string>
{
"ButtonCustom",
"PaginationButtonStyle",
"CustomWindowStyle"
};
#>
namespace HandyControl.Data
{
internal class ResourceToken
{
<#foreach(var item in geometryList){#>
public static readonly string <#=item#> = nameof(<#=item#>);
<#}#>
<#foreach(var item in brushList){#>
public static readonly string <#=item#> = nameof(<#=item#>);
<#}#>
<#foreach(var item in styleList){#>
public static readonly string <#=item#> = nameof(<#=item#>);
<#}#>
}
}
+16
View File
@@ -59,6 +59,13 @@
<Compile Include="Controls\Loading\LoadingBase.cs" /> <Compile Include="Controls\Loading\LoadingBase.cs" />
<Compile Include="Controls\Loading\LoadingCircle.cs" /> <Compile Include="Controls\Loading\LoadingCircle.cs" />
<Compile Include="Controls\Loading\LoadingLine.cs" /> <Compile Include="Controls\Loading\LoadingLine.cs" />
<Compile Include="Data\Enum\InfoType.cs" />
<Compile Include="Data\GrowlInfo.cs" />
<Compile Include="Data\ResourceToken.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>ResourceToken.tt</DependentUpon>
</Compile>
<Compile Include="Tools\SingleOpenHelper.cs" /> <Compile Include="Tools\SingleOpenHelper.cs" />
<Compile Include="Controls\Steps\StepBar.cs" /> <Compile Include="Controls\Steps\StepBar.cs" />
<Compile Include="Controls\Steps\StepItem.cs" /> <Compile Include="Controls\Steps\StepItem.cs" />
@@ -432,5 +439,14 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="Data\ResourceToken.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>ResourceToken.cs</LastGenOutput>
</Content>
</ItemGroup>
<ItemGroup>
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>
+5 -4
View File
@@ -5,6 +5,7 @@
xmlns:interactivity="clr-namespace:HandyControl.Interactivity"> xmlns:interactivity="clr-namespace:HandyControl.Interactivity">
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Basic/Converters.xaml"/>
<ResourceDictionary Source="../Basic/Geometries.xaml"/> <ResourceDictionary Source="../Basic/Geometries.xaml"/>
<ResourceDictionary Source="../Basic/Effects.xaml"/> <ResourceDictionary Source="../Basic/Effects.xaml"/>
<ResourceDictionary Source="TextBlock.xaml"/> <ResourceDictionary Source="TextBlock.xaml"/>
@@ -36,19 +37,19 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.ColumnSpan="3" Grid.RowSpan="2" Effect="{StaticResource EffectShadow2}" Background="White" CornerRadius="8" Width="320"/> <Border Grid.ColumnSpan="3" Grid.RowSpan="2" Effect="{StaticResource EffectShadow2}" Background="White" CornerRadius="8" Width="320"/>
<Path Grid.Row="0" Grid.Column="0" VerticalAlignment="Top" Margin="0,15,0,0" Width="30" Height="30" Data="{TemplateBinding Icon}" Stretch="Uniform" Fill="{TemplateBinding IconBrush}"/> <Path Grid.Row="0" Grid.Column="0" VerticalAlignment="Top" Margin="0,15,0,0" Width="30" Height="30" Data="{TemplateBinding Icon}" Stretch="Uniform" Fill="{TemplateBinding IconBrush}"/>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="0,12,10,10"> <StackPanel VerticalAlignment="Center" Grid.Row="0" Grid.Column="1" Margin="0,10,10,10">
<TextBlock Text="{TemplateBinding Message}" Style="{StaticResource TextBlockDefault}" HorizontalAlignment="Left" TextWrapping="Wrap"/> <TextBlock Text="{TemplateBinding Message}" Style="{StaticResource TextBlockDefault}" HorizontalAlignment="Left" TextWrapping="Wrap"/>
<TextBlock Text="{Binding Time,RelativeSource={RelativeSource FindAncestor,AncestorType=controls:Growl},StringFormat=yyyy/MM/dd HH:mm:ss}" Style="{StaticResource TextBlockDefault}" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Left" Margin="0,4,0,0"/> <TextBlock Visibility="{Binding ShowDateTime,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource Boolean2VisibilityConverter}}" Text="{Binding Time,RelativeSource={RelativeSource FindAncestor,AncestorType=controls:Growl},StringFormat=yyyy/MM/dd HH:mm:ss}" Style="{StaticResource TextBlockDefault}" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Left" Margin="0,4,0,0"/>
</StackPanel> </StackPanel>
<Button Grid.Row="0" Visibility="Collapsed" Margin="11,0" Name="PART_ButtonClose" Command="interactivity:ControlCommands.Close" Grid.Column="2" Background="Transparent" Style="{StaticResource ButtonCustom}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="18" Height="18"> <Button Grid.Row="0" Visibility="Collapsed" Margin="11,0" Name="PART_ButtonClose" Command="interactivity:ControlCommands.Close" Grid.Column="2" Background="Transparent" Style="{StaticResource ButtonCustom}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="18" Height="18">
<Path Data="{StaticResource ErrorGeometry}" Stretch="Uniform" Fill="{DynamicResource SecondaryTextBrush}"/> <Path Data="{StaticResource ErrorGeometry}" Stretch="Uniform" Fill="{DynamicResource SecondaryTextBrush}"/>
</Button> </Button>
<StackPanel Name="PART_PanelMore" IsEnabled="False" Visibility="Collapsed" Orientation="Horizontal" Grid.Row="1" Grid.ColumnSpan="3" Height="28" Grid.Column="0"> <StackPanel Name="PART_PanelMore" IsEnabled="False" Visibility="Collapsed" Orientation="Horizontal" Grid.Row="1" Grid.ColumnSpan="3" Height="28" Grid.Column="0">
<Button Command="interactivity:ControlCommands.Cancel" Style="{StaticResource ButtonCustom}" Width="160"> <Button Command="interactivity:ControlCommands.Cancel" Style="{StaticResource ButtonCustom}" Width="160">
<TextBlock Text="{x:Static langs:Lang.Cancel}" HorizontalAlignment="Center" Foreground="{DynamicResource DangerBrush}"/> <TextBlock Text="{Binding CancelStr,RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" Foreground="{DynamicResource DangerBrush}"/>
</Button> </Button>
<Button Command="interactivity:ControlCommands.Confirm" Style="{StaticResource ButtonCustom}" Width="160"> <Button Command="interactivity:ControlCommands.Confirm" Style="{StaticResource ButtonCustom}" Width="160">
<TextBlock Text="{x:Static langs:Lang.Confirm}" HorizontalAlignment="Center" Foreground="{DynamicResource PrimaryBrush}"/> <TextBlock Text="{Binding ConfirmStr,RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" Foreground="{DynamicResource PrimaryBrush}"/>
</Button> </Button>
</StackPanel> </StackPanel>
</Grid> </Grid>
+9
View File
@@ -312,6 +312,15 @@ namespace HandyControlDemo.Properties.Langs {
} }
} }
/// <summary>
/// 查找类似 忽略 的本地化字符串。
/// </summary>
public static string Ignore {
get {
return ResourceManager.GetString("Ignore", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 图片浏览器 的本地化字符串。 /// 查找类似 图片浏览器 的本地化字符串。
/// </summary> /// </summary>
@@ -342,4 +342,7 @@
<data name="OpenCustomContentWindow" xml:space="preserve"> <data name="OpenCustomContentWindow" xml:space="preserve">
<value>open custom content window</value> <value>open custom content window</value>
</data> </data>
<data name="Ignore" xml:space="preserve">
<value>Ignore</value>
</data>
</root> </root>
@@ -322,4 +322,7 @@
<data name="OpenCustomContentWindow" xml:space="preserve"> <data name="OpenCustomContentWindow" xml:space="preserve">
<value>点击打开自定义内容窗口</value> <value>点击打开自定义内容窗口</value>
</data> </data>
<data name="Ignore" xml:space="preserve">
<value>忽略</value>
</data>
</root> </root>
@@ -1,6 +1,7 @@
using System; using System;
using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Command;
using HandyControl.Controls; using HandyControl.Controls;
using HandyControl.Data;
namespace HandyControlDemo.ViewModel namespace HandyControlDemo.ViewModel
{ {
@@ -13,20 +14,37 @@ namespace HandyControlDemo.ViewModel
new RelayCommand(() => Growl.Success(Properties.Langs.Lang.GrowlSuccess))).Value; new RelayCommand(() => Growl.Success(Properties.Langs.Lang.GrowlSuccess))).Value;
public RelayCommand WarningCmd => new Lazy<RelayCommand>(() => public RelayCommand WarningCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(() => Growl.Warning(Properties.Langs.Lang.GrowlWarning))).Value; new RelayCommand(() => Growl.Warning(new GrowlInfo
{
Message = Properties.Langs.Lang.GrowlWarning,
CancelStr = Properties.Langs.Lang.Ignore,
ActionBeforeClose = isConfirmed =>
{
Growl.Info(isConfirmed.ToString());
return true;
}
}))).Value;
public RelayCommand ErrorCmd => new Lazy<RelayCommand>(() => public RelayCommand ErrorCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(() => Growl.Error(Properties.Langs.Lang.GrowlError))).Value; new RelayCommand(() => Growl.Error(Properties.Langs.Lang.GrowlError))).Value;
public RelayCommand AskCmd => new Lazy<RelayCommand>(() => public RelayCommand AskCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(() => Growl.Ask(Properties.Langs.Lang.GrowlAsk, isClosed => new RelayCommand(() => Growl.Ask(new GrowlInfo
{ {
Growl.Info(isClosed.ToString()); Message = Properties.Langs.Lang.GrowlAsk,
return true; ActionBeforeClose = isConfirmed =>
{
Growl.Info(isConfirmed.ToString());
return true;
}
}))).Value; }))).Value;
public RelayCommand FatalCmd => new Lazy<RelayCommand>(() => public RelayCommand FatalCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(() => Growl.Fatal(Properties.Langs.Lang.GrowlFatal))).Value; new RelayCommand(() => Growl.Fatal(new GrowlInfo
{
Message = Properties.Langs.Lang.GrowlFatal,
ShowDateTime = false
}))).Value;
public RelayCommand ClearCmd => new Lazy<RelayCommand>(() => public RelayCommand ClearCmd => new Lazy<RelayCommand>(() =>
new RelayCommand(Growl.Clear)).Value; new RelayCommand(Growl.Clear)).Value;