我允許用戶從工具箱拖放一些對象,當然每個object
都有一個唯一的ID。一旦使用了對象,我們假設放置在grid
或canvas
上,我需要顯示其屬性,因此我需要一個對象數組,每個對象都可以擁有自己的屬性。在C#/ WPF中存儲對象的屬性
你可以給我一些建議和方向如何實現一個類來處理多個對象,而每個對象可以堅持讓我們說10個屬性?
我允許用戶從工具箱拖放一些對象,當然每個object
都有一個唯一的ID。一旦使用了對象,我們假設放置在grid
或canvas
上,我需要顯示其屬性,因此我需要一個對象數組,每個對象都可以擁有自己的屬性。在C#/ WPF中存儲對象的屬性
你可以給我一些建議和方向如何實現一個類來處理多個對象,而每個對象可以堅持讓我們說10個屬性?
最好的解決方法是使用PropertyGrid
控件;您的應用程序看起來與Visual Studio相似,並且您的實現與此類似。
看一看這太問題對您有可用PropertyGrid
選項 - Is there a Property Dialog control that i can use in my WPF App?
現在你可以定義一個類爲每個控件,並宣佈該控件正常CLR性能;您不想在PropertyGrid中顯示的屬性可以標記爲BrowsableAttribute,PropertyGrid將會對此進行標記。
如果您想要更多地控制顯示的屬性,您可以創建自己的customattribute並修改PropertyGrid實現以使用該屬性並顯示用此屬性標記的屬性。
謝謝。是的,這似乎是我需要的。 –
@amitkohan很高興幫助。 – akjoshi
你能給我如何實現一個類 來處理多個對象,而每個對象可以抓住假設 10性質的一些建議和指導?
你沒有必要實施這樣的課程。我處理這個問題的方式是爲工具箱中的所有對象設置一個公共基類(例如ToolboxItem
),它只公開工具箱中所有項目的屬性和功能。
public abstract class ToolboxItem
{
public string Name { get; set; }
public Point Position { get; set; }
}
然後,您可以從這個類E.G.中導出您的特定項目。 TextToolboxItem
和RectangleToolboxItem
(或任何你想要的)。派生類然後可以只公開他們需要的屬性。
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
自定義ItemsPanel
和ItemContainerStyle
將您的項目「繪製」到設計圖面上。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>
最終的結果如下所示:
注意,所選擇的的屬性項目顯示在窗口的左側部分。
現在這個解決方案目前非常粗糙,但確實證明了您進一步開發這個方法的出發點。改進意見包括:
您需要提供有關該問題的更多詳細信息。 –
聽起來像你想要的對象列表。或者如果您想通過唯一鍵訪問每個對象,可能還需要一個字典。 – AndrewC
在您的類或WPF PropertyGrid中使用ObservableDictionary。 –