如何在设计时在控件 属性 的下拉列表中列出窗体上 typeX 组件的所有实例
How to list all instances of a component of typeX on a form in a drop down of a control property in design time
以下情况:
我有一个名为 ButtonGroupStyleController
的组件 class 和一个名为 EnhancedButton
的控件 class 属性:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(true)]
public ButtonGroupStyleController StyleController { get; set;}
在表单设计器的设计期间,我现在想在 属性 网格中为此 属性 填充当前放置的所有 ButtonGroupStyleController
实例的下拉列表在类似于标准表单属性 AcceptButton
和 CancelButton
的表单上,它们列出了表单上的所有 Button 实例。
我希望我描述的问题清晰易懂。
STyleControllerCode目前几乎是空的,因为我想先实现问题中的功能
namespace DarkTower.Core.Rendering.Forms
{
[Serializable]
public class ButtonGroupStyleController : Component, INotifyPropertyChanged
{
public ButtonGroupStyleController()
{
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
根据我的测试,你可以定义如下class来显示设计时的实例列表。
public class EnhancedButton:Button
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(true)]
public ButtonGroupStyleController StyleController { get; set; }
}
[Serializable]
public class ButtonGroupStyleController : Component, INotifyPropertyChanged
{
public ButtonGroupStyleController()
{
this.Text = "Hi Winform";
}
private string text;
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChanged("Text");
}
}
public event PropertyChangedEventHandler PropertyChanged;
//[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
添加两个 class 后,请重建项目并从工具箱中将 EnhanceButton 和 ButtonGroupStyleController 添加到表单中。
最后,请找到属性调用的stylecontroller,你会看到结果。
以下情况:
我有一个名为 ButtonGroupStyleController
的组件 class 和一个名为 EnhancedButton
的控件 class 属性:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(true)]
public ButtonGroupStyleController StyleController { get; set;}
在表单设计器的设计期间,我现在想在 属性 网格中为此 属性 填充当前放置的所有 ButtonGroupStyleController
实例的下拉列表在类似于标准表单属性 AcceptButton
和 CancelButton
的表单上,它们列出了表单上的所有 Button 实例。
我希望我描述的问题清晰易懂。
STyleControllerCode目前几乎是空的,因为我想先实现问题中的功能
namespace DarkTower.Core.Rendering.Forms
{
[Serializable]
public class ButtonGroupStyleController : Component, INotifyPropertyChanged
{
public ButtonGroupStyleController()
{
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
根据我的测试,你可以定义如下class来显示设计时的实例列表。
public class EnhancedButton:Button
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(true)]
public ButtonGroupStyleController StyleController { get; set; }
}
[Serializable]
public class ButtonGroupStyleController : Component, INotifyPropertyChanged
{
public ButtonGroupStyleController()
{
this.Text = "Hi Winform";
}
private string text;
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChanged("Text");
}
}
public event PropertyChangedEventHandler PropertyChanged;
//[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
添加两个 class 后,请重建项目并从工具箱中将 EnhanceButton 和 ButtonGroupStyleController 添加到表单中。
最后,请找到属性调用的stylecontroller,你会看到结果。