繁体   English   中英

wpf tabcontrol在窗口中加载所有选项卡时,使用C#从后面的代码为内容选项卡在内容模板中的文本块中设置了不同的文本

[英]wpf tabcontrol set different text to textblock in content template for all tabs on window load from code behind using C#

我正在使用WPF应用程序,在其中我想将TabControlItemTemplateContentTemplate一起使用。 我在ItemTemplate有一个textblock (用于Header),在ContentTemplate另一个textblock (对于Content)。 我从后面的代码将列表绑定到构造函数中的TabControl 在窗口加载事件中,我想遍历所有选项卡项,访问每个选项卡的内容模板中的textblock (Name =“ txt1”),并为每个选项卡中的文本textblock设置不同的文本。 以下是我的XAML:

<TabControl x:Name="mainTabs">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Header}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Name="txt1"></TextBlock>
            </DataTemplate>
        </TabControl.ContentTemplate>
</TabControl>

后面的代码:

public MainWindow()
        {
            InitializeComponent();
// Read tabs data from xml file
            List<MyTab> lst = ReadTabsFromXml();
            mainTabs.ItemsSource = lst;
}

public class MyTab
    {
        public string Header { get;set; }
        public string Content { get; set; }
    }

请帮我解决一下这个。

您不需要这样做。 只需将MyTab类存储在ObservableCollection<MyTab>而不是List<MyTab> ,然后将ItemsSource设置为集合。 TabControl将自动更新。

编辑:我已经更新了答案,并提供了有关使用Gecko浏览器的解决方案。 您可以将Gecko浏览器包装在每个TabItem使用的UserControl中。 还要注意,每次切换选项卡时, TabControl重新创建TabItem ,这也会导致重新加载网页。 您可以使用TabControEx代替TabControlhttps://stackoverflow.com/a/9802346/6839733 )来解决此问题。 但这与Gecko浏览器或与集合中的URL绑定无关-这只是TabControl工作方式。


MainWindow.xaml:

<TabControl x:Name="MyTabControl">
    <TabControl.Resources>
        <DataTemplate x:Key="MyTabContentTemplate" x:Shared="False">
            <local:GeckoBrowser Uri="{Binding Path=Uri}" />
        </DataTemplate>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="ContentTemplate" Value="{StaticResource MyTabContentTemplate}" />
        </Style>
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Header}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public ObservableCollection<WebPageInfo> WebPageCollection { get; set; }
    public MainWindow()
    {
        InitializeComponent();

        // Read tabs data from xml file
        //lst = ReadTabsFromXml();
        WebPageCollection = new ObservableCollection<WebPageInfo>();
        WebPageCollection.Add(new WebPageInfo() { Header = "Tab1", Uri = "https://www.amazon.com/" });
        WebPageCollection.Add(new WebPageInfo() { Header = "Tab2", Uri = "https://www.cnn.com/" });
        WebPageCollection.Add(new WebPageInfo() { Header = "Tab3", Uri = "https://www.microsoft.com/" });
        WebPageCollection.Add(new WebPageInfo() { Header = "Tab4", Uri = "https://www.facebook.com/" });

        MyTabControl.ItemsSource = WebPageCollection;
        MyTabControl.SelectedIndex = 0;
    }

    public class WebPageInfo
    {
        public string Header { get; set; }
        public string Uri { get; set; }
    }

}

GeckoBrowser.xaml:

<UserControl x:Class="WpfApplication1.GeckoBrowser"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication1"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Border x:Name="MyBorder" Background="Black" Margin="0" />
</UserControl>

GeckoBrowser.xaml.cs:

public partial class GeckoBrowser : UserControl
{
    public static readonly DependencyProperty UriProperty =
        DependencyProperty.Register("Uri", typeof(string), typeof(GeckoBrowser), new FrameworkPropertyMetadata(null));

    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }

    public GeckoBrowser()
    {
        InitializeComponent();
        Xpcom.Initialize("Firefox");
        Loaded += GeckoBrowser_Loaded;
    }

    private void GeckoBrowser_Loaded(object sender, RoutedEventArgs e)
    {
        WindowsFormsHost host = new WindowsFormsHost();
        GeckoWebBrowser browser = new GeckoWebBrowser();
        browser.Navigate(Uri);
        host.Child = browser;
        MyBorder.Child = host;
    }
}

暂无
暂无

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

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