【发布时间】:2017-12-16 14:20:19
【问题描述】:
问题: Grid.Row、Grid.Column、Canvas.SetTop 等属性本身就具有很好的 DesignTime 支持。您将它们附加到子元素,并观察 xaml 更新。它们的实现与我下面的示例有何不同?
示例:
在本例中,我创建了一个名为 position 的 附加属性。我可以将 position 属性附加到网格中的任何子元素。这样做会更新他们的行和列。
public static void SetPosition(DependencyObject obj, Positioning value) => obj.SetValue(PositionProperty, value);
public static void GetPosition(DependencyObject obj) => (Positioning)obj.GetValue(PositionProperty);
public static readonly DependencyProperty PositionProperty = DependencyProperty.RegisterAttatched( "Position", typeof(Positioning),
new PropertyMetadata( Positioning.Normal, OnPositionChanged));
public static void OnPositionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
UIElement item = obj as UIElement;
if(item == null)
return;
switch((Positioning) e.NewValue)
{
case Positioning.Middle:
Grid.SetRow(item, 4);
Grid.SetColumn(item, 2);
break;
default:
Grid.SetRow(item, 0);
Grid.SetColumn(item, 0);
}
}
//Usage:
<Rectangle local:Position="Middle" Fill="Pink" Height="40" Width="40"/>
这适用于运行时,但不适用于设计时。我最好的猜测是可能在设计时没有调用 OnPositionChanged?
我尝试过的事情:
- 当属性改变时调用函数(见上例)
- 添加 FrameworkPropertyMetadataOptions.AffectsRender 等属性
- 覆盖 ItemsControl 的 OnItemsChanged() 函数
【问题讨论】:
-
我认为这是因为 Designer Code Base 方面支持此属性
标签: c# wpf datagrid design-time