1

タイプ「リスト」のプロパティを作成している場所にカスタムコントロールを作成しています

Sections は、4 つのプロパティを持つ public クラスです。

コントロール内のコードは次のようになります。

    public partial class genericGauge : Control
{
        public genericGauge()
        {
            InitializeComponent();
        }

// Stripped out code not needed for this issue question.

        private List<Sections> indicators = new List<Sections>();

        public List<Sections> Indicators
        {
            get
            { 
                return indicators;                
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            // Stripped out code not needed for this issue question.
        }

}

セクション クラスは次のとおりです。

public class Sections
    {
        private string header = "Section1";        
        public string Header
        {
            get {return header;}
            set 
            {
                header = value;
            }
        }

        private float startvalue = 0.0f;        
        public float StartValue 
        {
            get { return startvalue; }
            set
            {
                startvalue = value;
            }
        }

        private float sweepvalue = 0.0f;       
        public float SweepValue
        {
            get { return sweepvalue; }
            set
            {
                sweepvalue = value;
            }
        }

        private Color sectioncolor = new Color();        
        public Color SectionColor
        {
            get {return sectioncolor;}
            set
            {
                sectioncolor = value;
            }
        }
    }

プロパティ ブラウザの typeeditor を使用してデザインタイムに項目をコレクションに追加すると、コレクションに追加された内容を反映するようにコントロールが再描画されないことを除いて、すべて正常に動作しているようです。

テストフォームのコントロールの外側をクリックすると、再描画されます。通常、単純なプロパティでは Invalidate を使用しますが、これはここでは不可能のようです。また、セットアクセサーを持つことが許可されているList<>以外のコレクションタイプでも試しましたが、Invalidateはまだ呼び出されません。SET が呼び出されないことを意味すると思います。

これを展開可能なプロパティで機能させる方法は知っていますが、コレクションでこの更新を行う方法を見つけることができません。

誰かが私を助けてくれることを願っています。前もって感謝します。

4

2 に答える 2

3

クラス List を使用する代わりに、クラス ObservableCollection を使用し、それを使用して、リストに新しいセクションが追加または削除されたときに通知を受け取ります。

private ObservableCollection<Sections> indicators = new ObservableCollection<Sections>();

public IList<Sections> Indicators
{
    get
    { 
        return indicators;                
    }
}

public genericGauge()
{
    InitializeComponent();

    this.indicators.CollectionChanged += this.IndicatorsCollectionChanged;
}

private void IndicatorsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // possibly inspect the NotifyCollectionChangedEventArgs to see if it's a change that should cause a redraw.

    // or not.
    this.Invalidate();
}
于 2013-02-27T15:47:11.503 に答える
0

例をそのまま使用すると、Indicatorsプロパティはプロパティウィンドウで編集できませんでした。そこで、いくつか変更を加えました。

新しいクラスを追加しました:

// Added this class to deal with the Sections class
public class SectionObservable : ObservableCollection<Sections>
{
        // Added a few methods here for creating a designtime collection if I need to.
}

それから私はあなたが提案したように変更を加えました

public genericGauge()
{
            InitializeComponent();
            this.indicators.CollectionChanged += this.IndicatorsCollectionChanged;  // your suggestion
}

代わりに、このようなプロパティを作成しました。

private SectionObservable indicators = new SectionObservable(); // using the SectionObservable class instead 

        public SectionObservable Indicators // using the SectionObservable class instead 
        {
            get
            { 
                return indicators;                
            }
        }

        private void IndicatorsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) // your suggestion
        {
            this.Invalidate();
        }

そして今、魅力として機能します。どうもありがとうございます。これほど早く助けを得ることが可能であることに感謝しています。私はこのフォーラムがとても好きです。

于 2013-02-28T11:35:37.993 に答える