현재 컨텍스트 메뉴 내에 UserControl을 표시하려는 응용 프로그램을 개발 중입니다. 나는 (다소 ToolStripControlHost를 사용하여 이것을 달성 할 수 있었다). 아래 그림은 (NumericUpDownToolStripItem code)입니다 : 아래는 VC++ .net 2.0으로 작성된 객체의 코드입니다. 참고 : 거기에 비슷한 세미 질문이 있지만 serialize하는 usercontrols, usercontrols 그냥 표준 개체를 다루는 것 같습니다.UserControl 디자이너를 호스팅하는 ToolStripControlHost Serializing이 발생하지 않습니다.
실제 usercontrol (레이블이있는 usercontrol) 및 numericupdown 컨트롤에 대한 코드가 개체 다음에 표시됩니다.
문제 : 내 응용 프로그램에 대한 디자이너를로드 할 때 NumericUpDownToolStripItem을 잘 추가 할 수 있지만 노출 된 속성을 사용하여 내 usercontrol을 편집 할 때 해당 데이터가 InitializeComponent 메서드에 직렬화되지 않습니다 내 NumericUpDownToolStripItem 개체 이것의 효과는 런타임에 모든 기본값으로 컨트롤이로드된다는 것입니다. 그리고 내 양식을 다시로드 할 때마다 수정 사항이 손실됩니다.
On Msdn에 위치한 TypeConverter 자습서를 사용해 보았지만 올바르게 작동하지 않았습니다. 내 객체가 디자인 격자에서 완전히 회색으로 된 것을 제외하고는 모든 것이 잘 컴파일되었습니다 (전체 매뉴 픽이 아닌 액세서 속성 만). 내가 알아챈 또 다른 문제점은이 메서드가 여러 다른 수정 가능한 속성을 가질 수있는 UserControls 용으로 특별히 설계되지 않았으며 각각에 대해 과부하를 가질 수 없다는 점입니다.
그래서, 나는 다음과 같은 질문이 :
- 내가 실제 뭘하는지, 아니면 내 구조 방법 오프 규범이다. 속성에 많은 중복성이있을 것입니다.
- 다른 UserControl \ toolstriphost '부모'에 들어있는 사용자 정의 컨트롤 '하위'를 serialize하는 올바른 방법은 무엇입니까? '자식'의 모든 속성은 단순한 값 (문자열, 소수점 등)입니다.
- TypeConverter 클래스가 구현되지 않았을 때, 속성 (예 : 레이블 텍스트)을 변경할 때마다 컨텍스트 메뉴 나 양식을 다시 볼 때까지 객체의 페인팅이 모두 종료되어 이상하게 동작합니다. 내가 변경했기 때문에 디자이너에게 다시 칠하도록 알릴 수있는 적절한 방법이 있습니까? (나는 최고로 dodgy 인 invalidate를 사용했다).
미리 감사드립니다. 나는 이것을 계속 연구하고 질문을 계속 업데이트 할 것입니다.
NumericUpDownToolStripItem Class:
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability::All)]
public ref class NumericUpDownToolStripItem : public ToolStripControlHost
{
public:
[DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property LabeledNumericUpDown ^LabeledNumericUpDownControl
{
LabeledNumericUpDown ^get() { return (LabeledNumericUpDown^)this->Control; }
}
public: NumericUpDownToolStripItem(void) :
ToolStripControlHost(gcnew LabeledNumericUpDown()) {}
protected: void OnSubscribeControlEvents(Control ^control) new { //irrelevant to question }
protected: void OnUnsubscribeControlEvents(Control ^control) new { //irrelevant to question }
};
public ref class LabeledNumericUpDown : public UserControl
{
public: [ DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property String ^DisplayText {
String ^get() {
return this->label->Text;
}
void set(String ^val) {
if(this->label->Text != val)
{
this->label->Text = val;
this->Invalidate();
}
}
}
//constructor
//destructor
//initiailecomponent
};
스레드 부활 죄송합니다,하지만 내가이 정확한 문제를 다루는 찾을 수있는 유일한 포스트 것으로 보인다. 나는 당신이 컨트롤 호스트 디자이너를 보이게하기 위해 무엇을했는지 궁금합니다 - 내가하는 일에 상관없이 Visual Studio에서 그것을 표시 할 수는없는 것 같습니다. MSDN 클레임이 디자이너 지원을 가능하게하는 모든 것을 적용했습니다. 어떤 조언을 많이 주시면 감사하겠습니다. –
나는 내가 한 일을 정확하게 기억하지 못한다. 그러나 나는이 통제가 풀려 났으며 "제품 안에있다"는 것을 알고있다. 코드를 추적하고 컨트롤 자체를 다시 게시하여 차이가 있는지 확인하려고합니다. – greggorob64
아래 새 게시물을 확인하십시오, 현재 작업 설정을 다시 게시했습니다. – greggorob64