我是一名非常新手的WPF程序员,所以在一些简单的任务中需要帮助。
1-如图所示,我想要(+)标签(它是一个用TabItem创建的标签,或者它应该是按钮还是别的?: - /)来创建一个标签,比如说( A1),再次按下,应该创建(A2),类似于选项卡式浏览器.........如果可能,按( - )删除用户提示上的选定选项卡。
alt text http://img191.imageshack.us/img191/4532/tabn.png
2-我希望,该用户在文本框中输入文本,内容用逗号或分号分隔,并且该内容被添加到按钮上的COMBOBOX按下/单击,我想,它需要某种数据绑定?不确定,..这样,到最后,来自文本框的内容成为ComboBox中的列表(在按钮上).................... 如果可能的话,在文本框中选择文本,按钮单击(选择相同或不同的按钮,将文本框内容添加到组合框),它会从文本框和组合框中删除相同的文本。
请帮助,我正在学习WPF,但需要这个紧急帮助,我目前对它的了解无法解决。谢谢。
答案 0 :(得分:2)
使用数据绑定和MVVM,一切都变得更容易。起初更难,但最终更容易。
制作两个实施Item
的课程ItemCollection
和INotifyPropertyChanged
。 Item
应该公开字符串Text
属性,而ItemCollection
应该公开ObservableCollection<Item>
Items
属性和Item
SelectedItem
属性。
让ItemCollection
类的构造函数使用测试数据填充Items
并设置SelectedItem
。
在实际开始实现制表符控件之前,这似乎要做很多事情,但相信我,你会喜欢这个结果。 TabControl的XAML看起来像这样:
<TabControl
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}">
<TabControl.DataContext>
<local:ItemsCollection/>
</TabControl.DataContext>
<TabControl.Resources>
<DataTemplate DataType="{x:Type local:Item}">
<TextBlock Background="AliceBlue" Text="{Binding Text}"/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Style.Setters>
<Setter Property="Header" Value="{Binding Text}"/>
</Style.Setters>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
让我们理解这是做什么的。它会创建一个TabControl
。它会创建一个ItemsCollection
对象,并将其设置为TabControl
的{{1}}。您已将DataContext
绑定到ItemSource
,因此Items
会为每个项目创建TabControl
。它会将TabItem
应用于每个ItemContainerStyle
,将TabItem
属性设置为Header
的{{1}}属性。
当控件呈现选项卡的内容时,它会找到要呈现的项目,搜索资源以查找Item
与项目匹配的Text
,并使用该模板。由于我们在DataTemplate
中定义了一个,因此您可以获得漂亮的蓝色背景和DataType
属性。
这似乎要经历很多事情。但是现在您不必编写任何操作UI的代码;你只需编写操纵你TabControl.Resources
的代码,而UI几乎可以自行处理。
现在让我们来处理添加新标签。我们要做的是向控件添加一个新项,当它被选中时,会向Text
集合中添加一个新项。
创建一个名为oh ItemsCollection
的新类。它来自Items
。修改您的ControlItem
构造函数,使其添加的最后一项是Item
,而不是ItemsCollection
。并让它将该项目的ControlItem
属性设置为“+”。
将此方法添加到Item
:
Text
现在添加到您窗口的代码隐藏中,并添加为ItemsCollection
的{{1}}事件处理程序:
public Item AddItem()
{
Item newItem = new Item {Text = "New item"};
Items.Insert(Items.Count-1, newItem);
return newItem;
}
您可以实现类似的逻辑来从列表中删除项目,但是您需要向SelectionChanged
引入另一个变量来跟踪之前选择的项目,以便您可以知道要删除的项目。
您可以做的另一件事:在TabControl
中实施void TabControl_SelectionChanged(object sender, RoutedEventArgs e)
{
TabControl tc = (TabControl) sender;
if (tc.SelectedItem is ControlItem)
{
ItemsCollection ic = (ItemsCollection) tc.DataContext;
tc.SelectedItem = ic.AddItem();
}
}
属性,并为ItemsCollection
的{{1}} Background
属性添加一个setter它。然后,您可以在Item
中重载该属性,以便您的添加和删除选项卡看起来不同。
您还可以为控件项实现不同的子类,并让它们公开您在ItemContainerStyle
事件处理程序中调用的方法。这样,事件处理程序不必知道被单击的控件项目正在做什么。事实上,如果你将方法作为TabItem
的一部分,除非它被覆盖,否则它不会做任何事情,窗口甚至不需要知道Background
有子类。
简而言之,这就是MVVM的理念:将视图绑定到它几乎不知道的对象。让视图模型对象控制发生的事情,以便视图不必。
答案 1 :(得分:0)
标签控件应该很简单。在+选项卡上处理Click事件,创建一个新选项卡并使其成为活动选项卡。应该很容易......我必须运行,所以现在无法向您显示代码答案。试一试,回过头来解决任何问题。
下一部分我可以提供更多帮助
<StackPanel>
<TextBox x:Name="txtOptions" TextChanged="OnTextChanged"></TextBox>
<ComboBox x:Name="cboSelect" ItemsSource="{Binding Path=Options}"/>
</StackPanel>
代码隐藏窗口(或您的类)必须实现INotifyPropertyChanged。还要将窗口的DataContext属性设置为自身(例如在ctor中),如this.DataContext = this;
public partial class Window1 : Window, INotifyPropertyChanged
{
string[] _options;
public string[] Options
{
get
{ return _options; }
set
{
_options = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Options"));
}
}
文本更改事件处理程序修改代码隐藏的Options属性并触发已修改属性的通知。 Combobox会收到通知,因为它是绑定到该属性并自行更新的数据。
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
this.Options = txtOptions.Text.Split(';');
}