更新
This commit is contained in:
147
WPFDark/Controls/BiaColorPanel.xaml.cs
Normal file
147
WPFDark/Controls/BiaColorPanel.xaml.cs
Normal file
@@ -0,0 +1,147 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using WPFDark.Internals;
|
||||
|
||||
namespace WPFDark.Controls
|
||||
{
|
||||
public class BiaColorPanel : FrameworkElement
|
||||
{
|
||||
#region Value
|
||||
|
||||
public ByteColor Value
|
||||
{
|
||||
get => _Value;
|
||||
set
|
||||
{
|
||||
if (value.Equals(_Value) == false)
|
||||
SetValue(ValueProperty, value);
|
||||
}
|
||||
}
|
||||
|
||||
private ByteColor _Value = ByteColor.White;
|
||||
|
||||
public static readonly DependencyProperty ValueProperty =
|
||||
DependencyProperty.Register(nameof(Value), typeof(ByteColor), typeof(BiaColorPanel),
|
||||
new FrameworkPropertyMetadata(
|
||||
Boxes.ByteColorWhite,
|
||||
FrameworkPropertyMetadataOptions.AffectsRender |
|
||||
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
|
||||
(s, e) =>
|
||||
{
|
||||
var self = (BiaColorPanel) s;
|
||||
self._Value = (ByteColor) e.NewValue;
|
||||
}));
|
||||
|
||||
#endregion
|
||||
|
||||
#region BorderColor
|
||||
|
||||
public ByteColor BorderColor
|
||||
{
|
||||
get => _BorderColor;
|
||||
set
|
||||
{
|
||||
if (value != _BorderColor)
|
||||
SetValue(BorderColorProperty, value);
|
||||
}
|
||||
}
|
||||
|
||||
private ByteColor _BorderColor = ByteColor.Transparent;
|
||||
|
||||
public static readonly DependencyProperty BorderColorProperty =
|
||||
DependencyProperty.Register(nameof(BorderColor), typeof(ByteColor), typeof(BiaColorPanel),
|
||||
new FrameworkPropertyMetadata(
|
||||
Boxes.ByteColorTransparent,
|
||||
FrameworkPropertyMetadataOptions.AffectsRender |
|
||||
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
|
||||
(s, e) =>
|
||||
{
|
||||
var self = (BiaColorPanel) s;
|
||||
self._BorderColor = (ByteColor) e.NewValue;
|
||||
}));
|
||||
|
||||
#endregion
|
||||
|
||||
#region CornerRadius
|
||||
|
||||
public double CornerRadius
|
||||
{
|
||||
get => _CornerRadius;
|
||||
set
|
||||
{
|
||||
if (NumberHelper.AreClose(value, _CornerRadius) == false)
|
||||
SetValue(CornerRadiusProperty, value);
|
||||
}
|
||||
}
|
||||
|
||||
private double _CornerRadius;
|
||||
|
||||
public static readonly DependencyProperty CornerRadiusProperty =
|
||||
DependencyProperty.Register(nameof(CornerRadius), typeof(double), typeof(BiaColorPanel),
|
||||
new FrameworkPropertyMetadata(
|
||||
0.0,
|
||||
FrameworkPropertyMetadataOptions.AffectsRender |
|
||||
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
|
||||
(s, e) =>
|
||||
{
|
||||
var self = (BiaColorPanel) s;
|
||||
self._CornerRadius = (double) e.NewValue;
|
||||
}));
|
||||
|
||||
#endregion
|
||||
|
||||
static BiaColorPanel()
|
||||
{
|
||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(BiaColorPanel),
|
||||
new FrameworkPropertyMetadata(typeof(BiaColorPanel)));
|
||||
}
|
||||
|
||||
protected override void OnRender(DrawingContext dc)
|
||||
{
|
||||
if (ActualWidth <= 1 ||
|
||||
ActualHeight <= 1)
|
||||
return;
|
||||
|
||||
var rounder = new LayoutRounder(this);
|
||||
|
||||
var rect = rounder.RoundRenderRectangle(true);
|
||||
|
||||
var borderPen = rounder.GetBorderPen(BorderColor);
|
||||
|
||||
if (IsEnabled)
|
||||
{
|
||||
var brush = Caches.GetSolidColorBrush(Value);
|
||||
|
||||
if (NumberHelper.AreCloseZero(CornerRadius))
|
||||
{
|
||||
if (Value.A != 0xFF)
|
||||
dc.DrawRectangle(Constants.CheckerBrush, null, rect);
|
||||
|
||||
dc.DrawRectangle(brush, borderPen, rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Value.A != 0xFF)
|
||||
dc.DrawRoundedRectangle(Constants.CheckerBrush, null, rect, CornerRadius, CornerRadius);
|
||||
|
||||
dc.DrawRoundedRectangle(brush, borderPen, rect, CornerRadius, CornerRadius);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NumberHelper.AreCloseZero(CornerRadius))
|
||||
dc.DrawRectangle(null, borderPen, rect);
|
||||
else
|
||||
dc.DrawRoundedRectangle(null, borderPen, rect, CornerRadius, CornerRadius);
|
||||
}
|
||||
}
|
||||
|
||||
protected override Size MeasureOverride(Size constraint)
|
||||
{
|
||||
// todo:DPI変更時に再描画が行われないため明示的に指示している。要調査。
|
||||
InvalidateVisual();
|
||||
|
||||
return new Size(ActualWidth, ActualHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user