2012-06-15 44 views
1

我允許用戶從工具箱拖放一些對象,當然每個object都有一個唯一的ID。一旦使用了對象,我們假設放置在gridcanvas上,我需要顯示其屬性,因此我需要一個對象數組,每個對象都可以擁有自己的屬性。在C#/ WPF中存儲對象的屬性

你可以給我一些建議和方向如何實現一個類來處理多個對象,而每個對象可以堅持讓我們說10個屬性?

+0

您需要提供有關該問題的更多詳細信息。 –

+0

聽起來像你想要的對象列表。或者如果您想通過唯一鍵訪問每個對象,可能還需要一個字典。 – AndrewC

+0

在您的類或WPF PropertyGrid中使用ObservableDictionary。 –

回答

1

最好的解決方法是使用PropertyGrid控件;您的應用程序看起來與Visual Studio相似,並且您的實現與此類似。

看一看這太問題對您有可用PropertyGrid選項 - Is there a Property Dialog control that i can use in my WPF App?

現在你可以定義一個類爲每個控件,並宣佈該控件正常CLR性能;您不想在PropertyGrid中顯示的屬性可以標記爲BrowsableAttribute,PropertyGrid將會對此進行標記。

如果您想要更多地控制顯示的屬性,您可以創建自己的customattribute並修改PropertyGrid實現以使用該屬性並顯示用此屬性標記的屬性。

+1

謝謝。是的,這似乎是我需要的。 –

+0

@amitkohan很高興幫助。 – akjoshi

1

你能給我如何實現一個類 來處理多個對象,而每個對象可以抓住假設 10性質的一些建議和指導?

你沒有必要實施這樣的課程。我處理這個問題的方式是爲工具箱中的所有對象設置一個公共基類(例如ToolboxItem),它只公開工具箱中所有項目的屬性和功能。

public abstract class ToolboxItem 
{ 
    public string Name { get; set; } 
    public Point Position { get; set; } 
} 

然後,您可以從這個類E.G.中導出您的特定項目。 TextToolboxItemRectangleToolboxItem(或任何你想要的)。派生類然後可以只公開他們需要的屬性。

public class TextToolboxItem : ToolboxItem 
{ 
    public string Text { get; set; } 
} 

public class RectangleToolboxItem : ToolboxItem 
{ 
    public Rect Bounds { get; set; } 
} 

存儲這些你可以只使用一個泛型集合,如:

ObservableCollection<ToolboxItem> items = new ObservableCollection<ToolboxItems>(); 

只要項目從ToolboxItem獲得他們都可以在單個集合內舉行,各個屬性都可以必須使用WPF的數據綁定功能。

然後,您可以創建並以下列方式公開數據:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<ToolboxItem> items; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     items = new ObservableCollection<ToolboxItem> 
     { 
      new TextToolboxItem { Name = "primaryText", 
            Text = "Hello world", 
            Position = new Point(40, 130) }, 
      new TextToolboxItem { Name = "secondaryText", 
            Text = "Hello world (again)", 
            Position = new Point(200, 30) }, 
      new RectangleToolboxItem { Position = new Point(50,300), 
             Name = "Rect1", 
             Bounds = new Rect(0, 0, 150, 85) }, 
     }; 
    } 

    public ObservableCollection<ToolboxItem> Items { get { return items; } } 
} 

要顯示在用戶界面這個信息,我將做到以下幾點:

  • 使用網格分割分爲兩部分。第一個是顯示所選項目的屬性,第二個顯示「設計圖面」
  • 使用ContentPresenter顯示所選項目的屬性。
  • 使用ListBox自定義ItemsPanelItemContainerStyle將您的項目「繪製」到設計圖面上。
  • 使用DataTemplate來告訴WPF如何在「屬性網格」和「設計曲面」中呈現每個項目(This後描述瞭如何針對不同對象使用不同的DataTemplate)。

達到這個所需的XAML如下所示:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:this="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*" /> 
     <ColumnDefinition Width="7*" /> 
    </Grid.ColumnDefinitions> 

    <ContentPresenter Content="{Binding ElementName=listBox, Path=SelectedItem}" 
         Margin="5"> 
     <ContentPresenter.Resources> 
      <DataTemplate DataType="{x:Type this:TextToolboxItem}"> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}"/> 
        <TextBlock Text="{Binding Position}"/> 
        <TextBlock Text="{Binding Text}"/> 
       </StackPanel> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type this:RectangleToolboxItem}"> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}"/> 
        <TextBlock Text="{Binding Position}"/> 
        <TextBlock Text="{Binding Bounds}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ContentPresenter.Resources> 
    </ContentPresenter> 

    <ListBox x:Name="listBox" Grid.Column="1" 
      Margin="5" ItemsSource="{Binding Items}"> 
     <ListBox.Resources> 
      <DataTemplate DataType="{x:Type this:TextToolboxItem}"> 
       <TextBox Text="{Binding Text}" 
         Margin="10"/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type this:RectangleToolboxItem}"> 
       <Rectangle Width="{Binding Bounds.Width}" 
          Height="{Binding Bounds.Height}" 
          Stroke="DarkRed" Fill="Pink"/> 
      </DataTemplate> 
     </ListBox.Resources> 

     <ListBox.ItemContainerStyle> 
      <Style> 
       <Setter Property="Canvas.Left" Value="{Binding Position.X}"/> 
       <Setter Property="Canvas.Top" Value="{Binding Position.Y}"/> 
      </Style> 
     </ListBox.ItemContainerStyle> 

     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 

</Grid> 

最終的結果如下所示:

enter image description here

注意,所選擇的的屬性項目顯示在窗口的左側部分。

現在這個解決方案目前非常粗糙,但確實證明了您進一步開發這個方法的出發點。改進意見包括:

  • 將代碼重新分解爲viewModel,以使其符合MVVM。
  • 處理拖放「設計表面」上的項目。
  • 更改屬性網格的「ContentPresenter」,爲顯示和編輯選定對象的屬性提供更豐富的支持。
相關問題