2016-11-08 230 views
1

我試圖用三個按鈕(線,圓和矩形)製作此迷你塗料。點擊每個按鈕後,將打印具有隨機顏色和起點的相關形狀。讓用戶選擇的形狀我做了這個組合框中看到的PropertyGrid其屬性:使用屬性網格更改屬性

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    switch (comboBox1.SelectedItem.ToString()) 
    { 
     case "circle": 
      { 
       propertyGrid1.SelectedObject = c; 
      } 
      break; 
     case "line": 
      { 
       propertyGrid1.SelectedObject = l; 
      } 
      break; 
     case "rectangle": 
      { 
       propertyGrid1.SelectedObject = r; 
      } 
      break; 
     default: 
      break; 
    } 
} 

C,L和R從圓,直線或矩形類的新對象。現在我希望能夠使用propertyGrid覆蓋屬性,例如更改圓圈顏色或起點。有些東西是這樣的:

private void propertyGrid1_Click(object sender, EventArgs e) 
{ 
    circle.changeproperties=Griditem.value; 
} 

那麼我該怎麼寫呢?

+0

你所做的是足以讓'PropertyGrid'編輯形狀的屬性。如果您希望這樣做改變屏幕上顯示的內容,請確保您將繪圖調用基於您在「PropertyGrid」中修改的相同形狀實例。還要記住在「OnPaint」方法或「Paint」事件處理程序中執行所有繪圖,並在屬性更改時調用「Invalidate()」使控件失效。 – adv12

+0

WinForms? WPF?的WebForms? MVC? –

回答

1

訣竅是:你不必做任何事情。通過設置propertyGrid1.SelectedObject = XXX來綁定您的對象實例PropertyGrid,您已經完成了。 網格會自動填充其編輯器,以便編輯該值。通過更改它們,這些值將自動寫回到相應的類實例。

去試試吧,寫在你的類一個完全成熟的屬性實現這樣

public int Radius 
    { 
     get { return _radius; } 
     set { _radius = value; } 
    } 

將斷點設置在二傳手。如果您更改UI中的值,您會看到它會被調用。

無論如何 - 現在您已將值返回到您的類實例中。精細。但是現在你必須觸發你的應用程序去做任何事情。通常情況下,控件應該立即使其自身失效以再次觸發其繪畫,以使UI中的變化可見。根據您的應用程序邏輯,您可以在Circle,Rectangle和Line類中實現INotifyPropertyChanged並對其作出反應。在這裏看到更多的細節:Implementing INotifyPropertyChanged - does a better way exist?

+0

這裏_radius是什麼? – sara

+0

只是一個保存int值的成員變量。其實,只是一個非常基本的財產實施。 – Waescher