简体   繁体   中英

How can I create a custom UserControl OnClosing event and only dispose of the form if the user does NOT cancel

I have a custom UserControl called ClosableTabItem which inherits from the TabItem control. I simply added a save button and a close button and I'm trying to wire in some event handlers. When the user clicks on the X (close), I want to invoke a "OnClosing" event with cancellation event arguments so that the user can put in some logic in the OnClosing event and if needed, cancel the close operation just like you can on a windows FormClosing event.

I'm not sure how I can fire the event and wait for a response before removing the tabitem from the collection.

Any ideas?

Thanks.

public class ClosableButtonTabItem : TabItem
{
    private readonly cTabButtonHeader _closableTabHeader;
    public event EventHandler<TabButtonClickEventArgs> OnTabButtonClick;
    public event EventHandler<System.ComponentModel.CancelEventArgs> OnTabClosing;
    public event EventHandler OnTabClosed;
    public UserControl AttachedForm { get; set; }

    public string Title
    {
        get => ((cTabButtonHeader) this.Header).label_TabTitle.Content.ToString();
        set => ((cTabButtonHeader)this.Header).label_TabTitle.Content = value;
    }

    public ClosableButtonTabItem()
    {
        _closableTabHeader = new cTabButtonHeader();
        Header = _closableTabHeader;

        _closableTabHeader.button_close.Source =
            ImageHelper.LocalPathToImageSource(ImageHelper.ImageSizes.Size_32x32, "x_off.png");

        _closableTabHeader.button_close.MouseEnter += button_close_MouseEnter;
        _closableTabHeader.button_close.MouseLeave += button_close_MouseLeave;
        _closableTabHeader.button_close.MouseLeftButtonDown += button_close_MouseLeftButtonDown;

        _closableTabHeader.label_TabTitle.SizeChanged += label_TabTitle_SizeChanged;

        //closableTabHeader.button_group.MouseEnter += button_save_MouseEnter;
        //closableTabHeader.button_group.MouseLeave += button_save_MouseLeave;
        _closableTabHeader.button_save.MouseLeftButtonDown += button_save_MouseLeftButtonDown;
    }

    void button_close_MouseLeftButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
    {
        OnTabClosing?.Invoke(this, new CancelEventArgs());

        //Code somewhere that if they don't cancel the OnClosing event the run:
        ((TabControl)Parent).Items.Remove(this);        }
}

I found it.

    void button_close_MouseLeftButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
    {
        if (OnTabClosing == null)
        {
            ((TabControl)Parent).Items.Remove(this);
            OnTabClosed?.Invoke(this, EventArgs.Empty);
            return;
        }

        foreach (var subHandler in OnTabClosing.GetInvocationList())
        {
            var cea = new TabButtonClosingEventArgs(AttachedForm);
            OnTabClosing?.Invoke(this, cea);
            if (cea.Cancel) continue;
            ((TabControl)Parent).Items.Remove(this);
            OnTabClosed?.Invoke(this, EventArgs.Empty);
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM