私は DesignSurface クラスを使用していますが、理解できないようなイライラする問題に遭遇しました。ツールボックスから項目をドラッグして問題なくフォームにドロップしていますが、これらの項目が DesignSurface に配置されるときにこれらの項目のプロパティを変更したいと考えています。したがって、たとえば、ラベルを DesignSurface にドラッグすると、コントロールの BackColor の値が変更される場合があります。ToolboxItem がプロパティのオプションのパラメーターを取る CreateComponents() を公開していることは知っていますが、これは下位レベルの API によって呼び出され、それをオーバーライドする場所や方法がわからないため、独自の値を指定できます。誰にもアイデアはありますか?ありがとう!
2 に答える
これは少し「ハッキー」だと思いますが、必ずしもそれが間違っているとは限りません (技術的に「間違っている」場合は、ベスト プラクティスについてフィードバックを残してください!)、目前の問題を解決しました。
私が最終的にやったのは、私が読んだ MSDN の記事に基づいて ToolboxItem を拡張することでした。
public class SurfaceToolboxItem : ToolboxItem
{
private delegate void SetTextHandler(Control c, string text);
public string ReportFieldName { get; set; }
protected override IComponent[] CreateComponentsCore(IDesignerHost host)
{
var ctrl = (Label)host.CreateComponent(typeof(Label));
var root = (Control) host.RootComponent;
root.BeginInvoke(new SetTextHandler(SetText),
new object[] {ctrl, ReportFieldName});
return new IComponent[]{ ctrl };
}
private void SetText(Control ctrl, string text)
{
ctrl.Text = text;
}
}
いくつかの明らかな欠陥:
- このアイテムは、Label コントロールのみを作成します
- このアイテムは、パブリック文字列プロパティに基づいて、ラベル コントロールのテキスト プロパティのみを設定します。
これらの問題を克服するために、項目を拡張して基本の ToolboxItem のように動作させることができます (Type パラメーターを受け入れる ctor を実装し、プロパティ名/値の辞書を渡して事後に設定できるようにするなど)。
さらに、これにより、ツールボックスからデザイン サーフェイスへのドラッグ アンド ドロップ機能が壊れてしまい、その理由があまり明らかではなかったため、特にイライラしました。問題は、ツールボックス サービス実装の DeserializeToolboxItem メソッドにありました。
もともとは次のように見えました。
ToolboxItem IToolboxService.DeserializeToolboxItem(object serializedObject)
{
return (ToolboxItem) ((DataObject) serializedObject).GetData(typeof (ToolboxItem));
}
問題は、オブジェクトが SurfaceToolboxItem 型であったため、ToolboxItem へのキャストが null を返すことだったので、メソッドを次のように変更しました。
ToolboxItem IToolboxService.DeserializeToolboxItem(object serializedObject)
{
var data = (ToolboxItem) ((DataObject) serializedObject).GetData(typeof (ToolboxItem));
return data ?? (ToolboxItem)((DataObject)serializedObject).GetData(typeof(SurfaceToolboxItem));
}
したがって、私の拡張機能とデフォルトの ToolboxItem の両方をサポートしています。