WPF附加属性不适用于在子元素中设置水平对齐
在我们的WPF 4.0项目(不是Silverlight)中,我们使用几个自定义的附加属性来设置容器所有子容器中的属性值,通常是WPF附加属性不适用于在子元素中设置水平对齐,wpf,wpf-4.0,attached-properties,Wpf,Wpf 4.0,Attached Properties,在我们的WPF 4.0项目(不是Silverlight)中,我们使用几个自定义的附加属性来设置容器所有子容器中的属性值,通常是网格或堆栈面板。与样式和其他替代方案相比,我们更喜欢这种策略,因为我们可以在容器的同一声明中使用更少的代码行 我们有一个自定义的附加属性,用于设置几个典型属性,例如容器所有子级的Margin属性。其中一个属性HorizontalAlignment出现问题。自定义附加属性与其他属性相同: public class HorizontalAlignmentSetter {
网格
或堆栈面板
。与样式和其他替代方案相比,我们更喜欢这种策略,因为我们可以在容器的同一声明中使用更少的代码行
我们有一个自定义的附加属性,用于设置几个典型属性,例如容器所有子级的Margin
属性。其中一个属性HorizontalAlignment
出现问题。自定义附加属性与其他属性相同:
public class HorizontalAlignmentSetter
{
public static readonly DependencyProperty HorizontalAlignmentProperty = DependencyProperty.RegisterAttached("HorizontalAlignment", typeof(HorizontalAlignment), typeof(HorizontalAlignmentSetter), new UIPropertyMetadata(HorizontalAlignment.Left, HorizontalAlignmentChanged));
public static HorizontalAlignment GetHorizontalAlignment(DependencyObject obj) { return (HorizontalAlignment)obj.GetValue(HorizontalAlignmentProperty); }
public static void SetHorizontalAlignment(DependencyObject obj, HorizontalAlignment value) { obj.SetValue(HorizontalAlignmentProperty, value); }
private static void HorizontalAlignmentChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var panel = sender as Panel;
if (panel == null) return;
panel.Loaded += PanelLoaded;
}
static void PanelLoaded(object sender, RoutedEventArgs e)
{
var panel = (Panel)sender;
foreach (var child in panel.Children)
{
var fe = child as FrameworkElement;
if (fe == null) continue;
fe.HorizontalAlignment = GetHorizontalAlignment(panel);
}
}
}
XAML中的用法也相同:
<Grid util:HorizontalAlignmentSetter.HorizontalAlignment="Left">
<Label .../>
<TextBox .../>
</Grid>
不会调用附加属性,因此不会在网格的子级中设置属性值。调试应用程序时,我们会看到调用静态属性声明(public static readonly dependencProperty HorizontalAlignmentProperty=dependencProperty.RegisterAttached…
),但不会调用其他代码,如SetHorizontalAlignment(DependencyObject obj…
因此回调私有静态void HorizontalAlignment已更改(对象发送方…
)
有什么想法吗?在XAML中,您将属性设置为默认值,这不会导致触发PropertyChanged
处理程序。除非从代码中调用样板文件Get和Set方法,否则将永远不会调用它们,因为XAML中设置的属性直接调用GetValue
和SetValue
(与正常DP上的包装器属性一样)
为了确保在设置值时始终调用更改处理程序,您可以使用null
,并在XAML中将默认值设置为null
,您将属性设置为默认值,这将不会导致触发PropertyChanged
处理程序。永远不会调用样板文件Get和set方法除非您从代码中调用它们,否则将被禁用,因为XAML中设置的属性直接调用GetValue
和SetValue
(与普通DP上的包装器属性一样)
为了确保在设置值时始终调用更改处理程序,您可以使用null
,并将默认值设置为null