协助我在xaml中定义UI

本文关键字:定义 UI xaml | 更新日期: 2023-09-27 17:53:36

这是我动态添加tabitem到tabcontrol的代码:

TabItem newTab = new TabItem();
newTab.Header = ncn.courseName;
newTab.FontSize = 20;
TextBox textbox = new TextBox();
textbox.HorizontalAlignment = HorizontalAlignment.Stretch;
textbox.VerticalAlignment = VerticalAlignment.Stretch;
textbox.FontSize = 12;
textbox.AcceptsReturn = true;
newTab.Content = textbox;
this.Courses.Items.Add(newTab);
this.Courses.SelectedItem = newTab;

我认为可能有更好的方法来做到这一点(即,在xaml中定义UI)。我是WPF的新手,不知道模板是如何工作的。所以请帮帮我吧!

注意:tabcontrol一开始是空的(不显示任何东西,没有tabitem,没有文本框)!我想添加新的选项卡只有当我点击"添加"按钮。


有人帮我弄明白了。

协助我在xaml中定义UI

第一件事是:在99%的情况下,用XAML编写UI是最好的。

第二,你应该告诉自己,WPF表示什么以及如何使用MVVM。如果你不这样做,你应该留在Windows窗体!

现在:

你ViewModel

:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PB.Base;
namespace DynTabItems
{
    public class MainWindowViewModel
    {
        public MainWindowViewModel()
        {
            AddItemCommand = new DelegateCommand(AddItem, CanAddItem);
            RemoveItemCommand = new DelegateCommand(RemoveItem, CanRemoveItem);
        }
        public DelegateCommand AddItemCommand { private set; get; }
        public DelegateCommand RemoveItemCommand { private set; get; }
        ObservableCollection<MyModel> _yourBehaviorClass = new ObservableCollection<MyModel>();
        MyModel _selectetItem;
        public MyModel SelectetItem
        {
            get { return _selectetItem; }
            set { _selectetItem = value; }
        }
        public ObservableCollection<MyModel> YourBehaviorClass
        {
            get { return _yourBehaviorClass; }
            set { _yourBehaviorClass = value; }
        }
        private void AddItem(object obj)
        {
            YourBehaviorClass.Add(new MyModel());
        }
        private bool CanRemoveItem(object obj)
        {
            return SelectetItem != null;
        }
        private bool CanAddItem(object obj)
        {
            return true;
        }
        private void RemoveItem(object obj)
        {
            YourBehaviorClass.Remove(SelectetItem);
        }
    }
}
现在你的XAML代码:
<Window x:Class="DynTabItems.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Button Content="Add" Command="{Binding AddItemCommand}"/>
        <Button Content="Remove" Command="{Binding RemoveItemCommand}"/>
        <TabControl ItemsSource="{Binding YourBehaviorClass}" SelectedItem="{Binding SelectetItem}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header" Value="{Binding YourHeader, UpdateSourceTrigger=PropertyChanged}"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <StackPanel>
                                <TextBox Text="{Binding YourText, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
                                    <ToolTipService.ToolTip>
                                        <TextBlock Text="{Binding Error}"/>
                                    </ToolTipService.ToolTip>
                                </TextBox>
                            </StackPanel>
                        </Setter.Value>
                    </Setter>
                </Style>
            </TabControl.ItemContainerStyle> 
        </TabControl>
    </StackPanel>
</Window>

最后但并非最不重要的MyModel:

using PB.Base;
using PB.Interfaces;
using PB.ValidationError;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DynTabItems
{
    public class MyModel : ViewModelBaseEx<MyModel>
    {
        public MyModel()
        {
            YourHeader = "You header String";
            ListOfExistingErrors = new ObservableCollection<IValidationErrorInfo<MyModel>>();
            ListOfExistingErrors.Add(new Error<MyModel>() { ErrorIndicator = "YourText", ErrorText = "Your Error Text", Predicate = s => string.IsNullOrEmpty(s.YourText) });
        }
        string _yourText;
        string _yourHeader;
        public string YourHeader
        {
            get { return _yourHeader; }
            set
            { 
                _yourHeader = value;
                SendPropertyChanged(() => YourHeader);
            }
        }
        public string YourText
        {
            get { return _yourText; }
            set 
            { 
                _yourText = value;
                SendPropertyChanged(() => YourText);
            }
        }
        public override ObservableCollection<IValidationErrorInfo<MyModel>> ListOfExistingErrors
        {
            get;
            set;
        }
    }
}

如果你需要的例子项目联系我。