使自定义控件或自定义面板在UWP中以设计时间接收事件

时间:2017-05-22 11:38:38

标签: events uwp design-time

如何使自定义控件或自定义面板在UWP中以设计时间接收事件? 例如,自定义控件可以在调整大小时接收事件,而自定义面板可以在其中推送另一个控件时接收事件。

1 个答案:

答案 0 :(得分:0)

如果要在自定义控件调整大小时收到事件,可以订阅SizeChanged事件。当控件的大小发生更改时,将调用SizeChanged事件,然后您可以处理SizeChangedEventArgs中的新大小或以前的大小。

<Button SizeChanged="Button_SizeChanged"/>

private void Button_SizeChanged(object sender, SizeChangedEventArgs e)
{
    // do some stuf
}

您还可以创建Resize事件,以根据SizeChanged事件收听各种控件尺寸。

<local:CustomControl Resize="CustomControl_Resize"/>


public sealed class CustomControl : TextBox
{
    public event SizeChangedEventHandler Resize;

    public CustomControl()
    {
        this.SizeChanged += CustomControl_SizeChanged;
    }

    private void CustomControl_SizeChanged(object sender, SizeChangedEventArgs e)
    {
      if(this.Resize != null)
        {
            this.Resize(this, e);
        }
    }
}
  

可以在调整大小和自定义面板时收到一个事件,当另一个控件被推入其中时。

您可以使用ArrangeOverride方法调用自定义事件。因为ArrangeOverride实现的必要模式是通过Panel.Children中每个元素的循环。始终在每个元素上调用Arrange方法。

public class BoxPanel : StackPanel
{
    public event EventHandler<ElementEventArgs> AddedElement;
    protected override Size ArrangeOverride(Size finalSize)
    {
        if (Children.Count > 0)
        {
            UIElement ele = Children.Last<UIElement>();
            if (ele != null && AddedElement != null)
            {
                this.AddedElement(this, new ElementEventArgs(ele));
            }
        }
        return base.ArrangeOverride(finalSize);
    }
}
public class ElementEventArgs : EventArgs
{
    private UIElement newElement;
    public UIElement NewElement { get => newElement; set => newElement = value; }

    public ElementEventArgs(UIElement ele)
    {
        this.newElement = ele;
    }
}

如果您订阅了AddedElement事件,则在您的自定义面板中推送新控件时,将调用AddedElement事件。

<local:BoxPanel  x:Name="MyBox"  AddedElement="MyBox_AddedElement">