Практическое руководство. Заключение элемента управления в оболочку ToolStripControlHost в Windows Forms
ToolStripControlHost обеспечивает возможность размещения произвольных элементов управления Windows Forms с помощью конструктора ToolStripControlHost или путем расширения самого ToolStripControlHost. Создавать оболочку для элемента управления проще путем расширения ToolStripControlHost и реализации свойств и методов, которые будут предоставлять часто используемые свойства и методы элемента управления. Можно также обеспечить доступ к событиям для элемента управления на уровне ToolStripControlHost.
Размещение элемента управления в ToolStripControlHost путем наследования
Расширьте ToolStripControlHost. Реализуйте конструктор без параметров, который вызывает конструктор базового класса для передачи в нужный элемент управления.
// Call the base constructor passing in a MonthCalendar instance. ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}
// Call the base constructor passing in a MonthCalendar instance. public ToolStripMonthCalendar() : base (new MonthCalendar()) { }
' Call the base constructor passing in a MonthCalendar instance. Public Sub New() MyBase.New(New MonthCalendar()) End Sub
Объявите свойство с типом, совпадающим с типом оболочки элемента управления и возвращающее
Control
в качестве корректного типа элемента управления в методе доступа для свойства.property MonthCalendar^ MonthCalendarControl { MonthCalendar^ get() { return static_cast<MonthCalendar^>(Control); } }
public MonthCalendar MonthCalendarControl { get { return Control as MonthCalendar; } }
Public ReadOnly Property MonthCalendarControl() As MonthCalendar Get Return CType(Control, MonthCalendar) End Get End Property
Обеспечьте доступ к часто используемым свойствам и методам оболочки элемента управления, реализовав свойства и метода в расширенном классе.
property Day FirstDayOfWeek { // Expose the MonthCalendar.FirstDayOfWeek as a property. Day get() { return MonthCalendarControl->FirstDayOfWeek; } void set( Day value ) { MonthCalendarControl->FirstDayOfWeek = value; } } // Expose the AddBoldedDate method. void AddBoldedDate( DateTime dateToBold ) { MonthCalendarControl->AddBoldedDate( dateToBold ); }
// Expose the MonthCalendar.FirstDayOfWeek as a property. public Day FirstDayOfWeek { get { return MonthCalendarControl.FirstDayOfWeek; } set { MonthCalendarControl.FirstDayOfWeek = value; } } // Expose the AddBoldedDate method. public void AddBoldedDate(DateTime dateToBold) { MonthCalendarControl.AddBoldedDate(dateToBold); }
' Expose the MonthCalendar.FirstDayOfWeek as a property. Public Property FirstDayOfWeek() As Day Get Return MonthCalendarControl.FirstDayOfWeek End Get Set MonthCalendarControl.FirstDayOfWeek = value End Set End Property ' Expose the AddBoldedDate method. Public Sub AddBoldedDate(ByVal dateToBold As DateTime) MonthCalendarControl.AddBoldedDate(dateToBold) End Sub
При необходимости переопределите методы OnSubscribeControlEvents и OnUnsubscribeControlEvents и добавьте события элемента управления, к которому требуется предоставить доступ.
void OnSubscribeControlEvents( System::Windows::Forms::Control^ c ) { // Call the base so the base events are connected. __super::OnSubscribeControlEvents( c ); // Cast the control to a MonthCalendar control. MonthCalendar^ monthCalendarControl = (MonthCalendar^)c; // Add the event. monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged ); } void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c ) { // Call the base method so the basic events are unsubscribed. __super::OnUnsubscribeControlEvents( c ); // Cast the control to a MonthCalendar control. MonthCalendar^ monthCalendarControl = (MonthCalendar^)c; // Remove the event. monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged ); }
protected override void OnSubscribeControlEvents(Control c) { // Call the base so the base events are connected. base.OnSubscribeControlEvents(c); // Cast the control to a MonthCalendar control. MonthCalendar monthCalendarControl = (MonthCalendar) c; // Add the event. monthCalendarControl.DateChanged += new DateRangeEventHandler(OnDateChanged); } protected override void OnUnsubscribeControlEvents(Control c) { // Call the base method so the basic events are unsubscribed. base.OnUnsubscribeControlEvents(c); // Cast the control to a MonthCalendar control. MonthCalendar monthCalendarControl = (MonthCalendar) c; // Remove the event. monthCalendarControl.DateChanged -= new DateRangeEventHandler(OnDateChanged); }
Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control) ' Call the base so the base events are connected. MyBase.OnSubscribeControlEvents(c) ' Cast the control to a MonthCalendar control. Dim monthCalendarControl As MonthCalendar = _ CType(c, MonthCalendar) ' Add the event. AddHandler monthCalendarControl.DateChanged, _ AddressOf HandleDateChanged End Sub Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control) ' Call the base method so the basic events are unsubscribed. MyBase.OnUnsubscribeControlEvents(c) ' Cast the control to a MonthCalendar control. Dim monthCalendarControl As MonthCalendar = _ CType(c, MonthCalendar) ' Remove the event. RemoveHandler monthCalendarControl.DateChanged, _ AddressOf HandleDateChanged End Sub
Создайте необходимую оболочку для событий, доступ к которым требуется предоставить.
// Declare the DateChanged event. // Raise the DateChanged event. void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e ) { if ( DateChanged != nullptr ) { DateChanged( this, e ); } }
// Declare the DateChanged event. public event DateRangeEventHandler DateChanged; // Raise the DateChanged event. private void OnDateChanged(object sender, DateRangeEventArgs e) { if (DateChanged != null) { DateChanged(this, e); } }
' Declare the DateChanged event. Public Event DateChanged As DateRangeEventHandler ' Raise the DateChanged event. Private Sub HandleDateChanged(ByVal sender As Object, _ ByVal e As DateRangeEventArgs) RaiseEvent DateChanged(Me, e) End Sub End Class
Пример
//Declare a class that inherits from ToolStripControlHost.
public ref class ToolStripMonthCalendar: public ToolStripControlHost
{
public:
// Call the base constructor passing in a MonthCalendar instance.
ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}
property MonthCalendar^ MonthCalendarControl
{
MonthCalendar^ get()
{
return static_cast<MonthCalendar^>(Control);
}
}
property Day FirstDayOfWeek
{
// Expose the MonthCalendar.FirstDayOfWeek as a property.
Day get()
{
return MonthCalendarControl->FirstDayOfWeek;
}
void set( Day value )
{
MonthCalendarControl->FirstDayOfWeek = value;
}
}
// Expose the AddBoldedDate method.
void AddBoldedDate( DateTime dateToBold )
{
MonthCalendarControl->AddBoldedDate( dateToBold );
}
protected:
// Subscribe and unsubscribe the control events you wish to expose.
void OnSubscribeControlEvents( System::Windows::Forms::Control^ c )
{
// Call the base so the base events are connected.
__super::OnSubscribeControlEvents( c );
// Cast the control to a MonthCalendar control.
MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
// Add the event.
monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
}
void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c )
{
// Call the base method so the basic events are unsubscribed.
__super::OnUnsubscribeControlEvents( c );
// Cast the control to a MonthCalendar control.
MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
// Remove the event.
monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
}
public:
event DateRangeEventHandler^ DateChanged;
private:
// Declare the DateChanged event.
// Raise the DateChanged event.
void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e )
{
if ( DateChanged != nullptr )
{
DateChanged( this, e );
}
}
};
//Declare a class that inherits from ToolStripControlHost.
public class ToolStripMonthCalendar : ToolStripControlHost
{
// Call the base constructor passing in a MonthCalendar instance.
public ToolStripMonthCalendar() : base (new MonthCalendar()) { }
public MonthCalendar MonthCalendarControl
{
get
{
return Control as MonthCalendar;
}
}
// Expose the MonthCalendar.FirstDayOfWeek as a property.
public Day FirstDayOfWeek
{
get
{
return MonthCalendarControl.FirstDayOfWeek;
}
set { MonthCalendarControl.FirstDayOfWeek = value; }
}
// Expose the AddBoldedDate method.
public void AddBoldedDate(DateTime dateToBold)
{
MonthCalendarControl.AddBoldedDate(dateToBold);
}
// Subscribe and unsubscribe the control events you wish to expose.
protected override void OnSubscribeControlEvents(Control c)
{
// Call the base so the base events are connected.
base.OnSubscribeControlEvents(c);
// Cast the control to a MonthCalendar control.
MonthCalendar monthCalendarControl = (MonthCalendar) c;
// Add the event.
monthCalendarControl.DateChanged +=
new DateRangeEventHandler(OnDateChanged);
}
protected override void OnUnsubscribeControlEvents(Control c)
{
// Call the base method so the basic events are unsubscribed.
base.OnUnsubscribeControlEvents(c);
// Cast the control to a MonthCalendar control.
MonthCalendar monthCalendarControl = (MonthCalendar) c;
// Remove the event.
monthCalendarControl.DateChanged -=
new DateRangeEventHandler(OnDateChanged);
}
// Declare the DateChanged event.
public event DateRangeEventHandler DateChanged;
// Raise the DateChanged event.
private void OnDateChanged(object sender, DateRangeEventArgs e)
{
if (DateChanged != null)
{
DateChanged(this, e);
}
}
}
'Declare a class that inherits from ToolStripControlHost.
Public Class ToolStripMonthCalendar
Inherits ToolStripControlHost
' Call the base constructor passing in a MonthCalendar instance.
Public Sub New()
MyBase.New(New MonthCalendar())
End Sub
Public ReadOnly Property MonthCalendarControl() As MonthCalendar
Get
Return CType(Control, MonthCalendar)
End Get
End Property
' Expose the MonthCalendar.FirstDayOfWeek as a property.
Public Property FirstDayOfWeek() As Day
Get
Return MonthCalendarControl.FirstDayOfWeek
End Get
Set
MonthCalendarControl.FirstDayOfWeek = value
End Set
End Property
' Expose the AddBoldedDate method.
Public Sub AddBoldedDate(ByVal dateToBold As DateTime)
MonthCalendarControl.AddBoldedDate(dateToBold)
End Sub
' Subscribe and unsubscribe the control events you wish to expose.
Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control)
' Call the base so the base events are connected.
MyBase.OnSubscribeControlEvents(c)
' Cast the control to a MonthCalendar control.
Dim monthCalendarControl As MonthCalendar = _
CType(c, MonthCalendar)
' Add the event.
AddHandler monthCalendarControl.DateChanged, _
AddressOf HandleDateChanged
End Sub
Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
' Call the base method so the basic events are unsubscribed.
MyBase.OnUnsubscribeControlEvents(c)
' Cast the control to a MonthCalendar control.
Dim monthCalendarControl As MonthCalendar = _
CType(c, MonthCalendar)
' Remove the event.
RemoveHandler monthCalendarControl.DateChanged, _
AddressOf HandleDateChanged
End Sub
' Declare the DateChanged event.
Public Event DateChanged As DateRangeEventHandler
' Raise the DateChanged event.
Private Sub HandleDateChanged(ByVal sender As Object, _
ByVal e As DateRangeEventArgs)
RaiseEvent DateChanged(Me, e)
End Sub
End Class
Компиляция кода
Для этого примера требуются:
- ссылки на сборки System и System.Windows.Forms;
См. также
.NET Desktop feedback