繁体   English   中英

以编程方式添加和编辑控件

[英]Programmatically add and edit controls

我以编程方式创建WPF TabItem,并将其添加到我的TabControl中。

   var tabItem = new TabItem { Header = "foo" };

现在我想做类似的事情

   var txt1 = new TextBlock { Text = "foo" };
   var txt2 = new TextBlock { Text = "bar" };

   var tabItem = new TabItem { Header = txt1 + txt2 }; // cannot apply operator + to TextBlock and TextBlock
   // Other Idea:
   // var tabItem = new TabItem { Header = new TextBlock { Text = "foo" }.Text + new TextBlock { Name = "txt2", Text = "bar" }};
   // Maybe I could edit my TextBlock via it's name?
   ...
   txt2.Text = "editedBar"; // have to update the header of tabItem.

反正有可能吗? 我知道在XAML中不会有问题。 但是现有的架构迫使我尝试这种方式。

我会做这样的事情:

StackPanel panel = new StackPanel();
panel.Children.Add(txt1);
panel.Children.Add(txt2);

var tabItem = new TabItem { Header = panel };

OP要求以编程方式创建WPF TabItems并通过添加UserControls将其添加到TabControl ,但是如果您具有对象的ListCollection ,则可以将它们绑定到TabControl.ItemsSource然后使用DataTemplates指定ItemTemplateContentTemplate

TabControl XAML:

<TabControl ItemsSource="{Binding MyItems}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{} {0}{1}">
                    <Binding Path="HeaderA"/>
                    <Binding Path="HeaderB"/>
                </MultiBinding>
            </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
        <TextBlock>
            <TextBlock.Text>
            <Binding Path="MyContent"/>
            </TextBlock.Text>
        </TextBlock>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

用于TabControl的MyItem

public class MyItem {
    public string HeaderA { get; set; }
    public string HeaderB { get; set; }
    public string MyContent { get; set; }
}

MyItem对象列表

public List<MyItem> MyItems {
    get {
        return new List<MyItem>() {
            new MyItem() { 
                HeaderA = "Foo0", 
                HeaderB = "Bar0", 
                MyContent = "This is content."
            },
            new MyItem() { 
                HeaderA = "Foo1",
                HeaderB = "Bar1",
                MyContent = "This is content."}
            };
        }
    }
}

这样,您可以将MyContent更改为object类,然后使用具有DataType属性的DataTemplates来指定在内容模板中具有不同对象时在ContentTemplate中显示的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM