help
Root Question Message
public static class RoundedCorners {
public static readonly DependencyProperty RadiusProperty = DependencyProperty.RegisterAttached(
"Radius",
typeof(CornerRadius),
typeof(RoundedCorners),
new PropertyMetadata(default(CornerRadius), RadiusChanged));
public static void SetRadius(DependencyObject element, CornerRadius value) {
element.SetValue(RadiusProperty, value);
}
public static CornerRadius GetRadius(DependencyObject element) {
return (CornerRadius)element.GetValue(RadiusProperty);
}
public static void RadiusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
Border? border = d as Border;
if (border == null) {
border = UIHelper.FindChild<Border>(d);
}
if (border == null) {
InitialRadiusSet(d, e);
return;
}
border.CornerRadius = (CornerRadius)e.NewValue;
}
private static void InitialRadiusSet(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var element = d as Control;
if (element == null) return;
element.Loaded -= LoadedHandler;
element.Loaded += LoadedHandler;
}
private static void LoadedHandler(object sender, RoutedEventArgs e) {
var element = sender as Control;
if (element == null) return;
var border = UIHelper.FindChild<Border>(element);
if (border == null) return;
var radius = GetRadius(element);
border.CornerRadius = radius;
}
}
//one of few sample dependency properties
public static readonly DependencyProperty TopLeftProperty = DependencyProperty.RegisterAttached(
"TopLeft",
typeof(double),
typeof(RoundedCorners),
new PropertyMetadata(default(double), TopLeftChanged));
public static void SetTopLeft(DependencyObject element, double value) {
element.SetValue(TopLeftProperty, value);
}
public static double GetTopLeft(DependencyObject element) {
return (double)element.GetValue(TopLeftProperty);
}
private static void TopLeftChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var cornerRadius = GetRadius(d);
cornerRadius.TopLeft = (double)e.NewValue;
SetRadius(d, cornerRadius);
}
______
private static void InitialRadiusSet(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var element = d as Control;
if (element == null) return;
element.Loaded -= LoadedHandler;
element.Loaded += LoadedHandler;
}
private static void LoadedHandler(object sender, RoutedEventArgs e) {
var element = sender as Control;
if (element == null) return;
var border = UIHelper.FindChild<Border>(element);
if (border == null) return;
var radius = GetRadius(element);
border.CornerRadius = radius;
}
element.Loaded -= LoadedHandler;
element.Loaded += LoadedHandler;
_______
<Button
Width="40"
Height="40"
Margin="10"
attached:RoundedCorners.Radius="{StaticResource RoundedSmRadius}"
Background="{StaticResource BrushBgOverlay}"
BorderThickness="0"
Command="{Binding ConfirmTitleCommand}">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
public static T? FindChild<T>(DependencyObject parent)
where T : DependencyObject {
if (parent == null) return null;
T? foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++) {
var child = VisualTreeHelper.GetChild(parent, i);
T? childType = child as T;
if (childType != null) {
foundChild = (T)child;
break;
}
foundChild = FindChild<T>(child);
if (foundChild != null) break;
}
return foundChild;
}