[英]Behavior at DesignMode (DesignTime)
I have a CustomBehavior
which is working perfect at runtime. 我有一个
CustomBehavior
,可以在运行时完美运行。 Now I also want to have some "behavior" at the DesignMode
. 现在,我还想在
DesignMode
上具有一些“行为”。 But my OnAttached()
is not called at DesignMode
( https://www.codeproject.com/Tips/1040701/How-to-Debug-the-Design-Time-Errors-in-WPF-XAML-Fi ). 但是我的
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;
}
}
}
Is there a trick, how to call my _DesignMethod()
at DesignMode
? 有一个技巧,如何在
DesignMode
调用我的_DesignMethod()
?
This is currently my solution. 这是目前我的解决方案。 But it is not perfect and it would be nice if you could omit the
DesignerElement
property
. 但这不是完美的,如果您可以省略
DesignerElement
property
,那就太好了。
To get this working, you need to pass in your xaml
code the attached object/element. 为了使此工作正常进行,您需要在
xaml
代码中传递附加的对象/元素。 Unfortunately LogicalTreeHelper
or VisualTreeHelper
cannot find my object/element. 不幸的是
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
}
<Grid x:Name="myGrid">
<I:Interaction.Behaviors>
<MyBehaviors:InheritedBehavior DesignerValue="1" DesignerElement="{Binding ElementName=myGrid}"/>
</I:Interaction.Behaviors>
</Grid>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.