2017-10-05 22 views
0

我有一个自定义的UserControl,名为ClosableTabItem,它继承自TabItem控件。我只是添加了一个保存按钮和一个关闭按钮,我试图在一些事件处理程序中连线。当用户点击X(关闭)时,我想用取消事件参数调用一个“OnClosing”事件,这样用户就可以在OnClosing事件中放入一些逻辑,并且如果需要,就可以像关闭一样取消关闭操作一个windows FormClosing事件。如何创建自定义的UserControl OnClosing事件并仅在用户未取消的情况下处理表单

我不知道如何在从集合中删除tabitem之前触发事件并等待响应。

任何想法?

谢谢。

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);  } 
} 

回答

-1

我找到了。

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); 
     } 
    } 
相关问题