我有一个CustomBehavior,它在运行时工作得很好。现在我也想在DesignMode上有一些“行为”。但是我的OnAttached()不是在DesignMode (https://www.codeproject.com/Tips/1040701/How-to-Debug-the-Design-Time-Errors-in-WPF-XAML-Fi)调用的。
public class CustomBehavior : Behavior<FrameworkElement>
{
protected override void OnAttached()
{
if (DesignerProperties.GetIsInDesignMode(this))
{
_TargetProperty = AssociatedObject.GetType().GetProperty(TargetPropertyName);
_DesignMethod();
}
else
{
AssociatedObject.Unloaded += AssociatedObject_Unloaded;
AssociatedObject.Loaded += AssociatedObject_Loaded;
}
}
}在DesignMode上如何调用我的_DesignMethod()有什么窍门吗?
发布于 2017-06-29 15:03:52
这是我目前的解决方案。但它并不完美,如果您可以省略DesignerElement property就更好了。
要使其正常工作,您需要在xaml代码中传递附加的对象/元素。不幸的是,LogicalTreeHelper或VisualTreeHelper找不到我的对象/元素。
抽象行为
public abstract class DesignerBaseBehavior : Behavior<FrameworkElement>
{
// ##############################################################################################################################
// Dependency Properties
// ##############################################################################################################################
#region Dependency Properties
/// <summary>
/// The Associated object.
/// </summary>
public FrameworkElement DesignerElement
{
get { return (FrameworkElement)GetValue(DesignerElementProperty); }
set { SetValue(DesignerElementProperty, value); }
}
/// <summary>
/// The <see cref="DesignerElement"/> DependencyProperty.
/// </summary>
public static readonly DependencyProperty DesignerElementProperty = DependencyProperty.Register("DesignerElement", typeof(FrameworkElement), typeof(DesignerBaseBehavior), new PropertyMetadata(null, _ApplyDesignerElement));
/// <summary>
/// Value during the design time
/// </summary>
public object DesignerValue
{
get { return GetValue(DesignerValueProperty); }
set { SetValue(DesignerValueProperty, value); }
}
/// <summary>
/// The <see cref="DesignerValue"/> DependencyProperty.
/// </summary>
public static readonly DependencyProperty DesignerValueProperty = DependencyProperty.Register("DesignerValue", typeof(object), typeof(DesignerBaseBehavior), new PropertyMetadata(null, _ApplyDesignerElement));
private static void _ApplyDesignerElement(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
DesignerBaseBehavior designerBaseBehavior = dependencyObject as DesignerBaseBehavior;
designerBaseBehavior?._ApplyDesignerElement();
}
#endregion
// ##############################################################################################################################
// Private Properties
// ##############################################################################################################################
#region Private Properties
internal FrameworkElement _AssociatedObject;
#endregion
// ##############################################################################################################################
// Overrides
// ##############################################################################################################################
#region Overrides
/// <summary>
/// Wird aufgerufen, wenn die Behavior angehängt wird.
/// </summary>
protected override void OnAttached()
{
if (HtDesignerProperties.IsInDesignMode)
{
_ApplyDesignerElement();
}
else
{
_AssociatedObject = AssociatedObject;
}
}
#endregion
// ##############################################################################################################################
// Methods
// ##############################################################################################################################
#region Methods
private void _ApplyDesignerElement()
{
if (DesignerElement == null) return;
if(!HtDesignerProperties.IsInDesignMode) return;
_AssociatedObject = DesignerElement;
DesignTime();
}
/// <summary>
/// Is called, when the _AssociatedObject is set.
/// </summary>
public abstract void DesignTime();
#endregion
}XAML用法
<Grid x:Name="myGrid">
<I:Interaction.Behaviors>
<MyBehaviors:InheritedBehavior DesignerValue="1" DesignerElement="{Binding ElementName=myGrid}"/>
</I:Interaction.Behaviors>
</Grid>预览

https://stackoverflow.com/questions/44805284
复制相似问题