无法在WPF的单独选项卡中显示不同的cefsharp页面

时间:2020-02-22 17:19:11

标签: c# wpf cefsharp

我试图使用WPF在标签页中创建一个浏览器,但我具有动态标签页,但是每当创建一个新标签页时,它将所有标签页都设置为默认地址(duckduckgo.com),如何为每个标签页显示不同的网页标签?

我有一个带有后退前进和前进按钮的导航栏,我还想知道如何使前进后退选项不包含在选项卡中,我想不要使用Browser.CanGoBack之类的东西必须使用Tab定义而不是浏览器。

代码:

XAML:

        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TabControl Name="tabDynamic" ItemsSource="{Binding}" SelectionChanged="tabDynamic_SelectionChanged" Grid.Row="0">
            <TabControl.Resources>
                <DataTemplate x:Key="TabHeader" DataType="TabItem">
                    <DockPanel>
                        <DockPanel LastChildFill="True" DockPanel.Dock="Top">
                            <Button Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" Click="btnDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Name}">
                            </Button>
                        </DockPanel>
                    </DockPanel>
                </DataTemplate>
            </TabControl.Resources>
        </TabControl>
        <DockPanel Grid.Row="1">
            <DockPanel LastChildFill="True" DockPanel.Dock="Top">
                <Button Content="&lt;Back" Name ="backree" Click="backree_Click"> </Button>
                <Button Content="Go" Name ="navixd" Click="navixd_Click"></Button>
                <Button Content="Forward&gt;" Name ="forwardyikes" Click="forwardyikes_Click"></Button>
                <TextBox Name="addbox"></TextBox>
            </DockPanel>
            <cefsharp:ChromiumWebBrowser Address="StackOverflow.com" FrameLoadEnd="ChromiumWebBrowser_OnFrameLoadEnd" Name="Browser"></cefsharp:ChromiumWebBrowser>
        </DockPanel>

    </Grid>

C#:

    public partial class MainWindow : Window
    {
        private List<TabItem> _tabItems;
        private TabItem _tabAdd;

        public MainWindow()
        {
            try
            {
                InitializeComponent();

                _tabItems = new List<TabItem>();

                _tabAdd = new TabItem();
                _tabAdd.Header = "+";
                _tabAdd.MouseLeftButtonUp += new MouseButtonEventHandler(tabAdd_MouseLeftButtonUp);

                _tabItems.Add(_tabAdd);

                this.AddTabItem();

                tabDynamic.DataContext = _tabItems;

                tabDynamic.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private TabItem AddTabItem()
        {
            int count = _tabItems.Count;

            TabItem tab = new TabItem();

            tab.Header = string.Format("Tab {0}", count);
            tab.Name = string.Format("tab{0}", count);
            tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate;

            Browser.Address = "duckduckgo.com";

            _tabItems.Insert(count - 1, tab);

            return tab;
        }

        private void tabAdd_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            tabDynamic.DataContext = null;

            TabItem tab = this.AddTabItem();

            tabDynamic.DataContext = _tabItems;

            tabDynamic.SelectedItem = tab;
        }

        private void tabDynamic_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            TabItem tab = tabDynamic.SelectedItem as TabItem;
            if (tab == null) return;

            if (tab.Equals(_tabAdd))
            {
                tabDynamic.DataContext = null;

                TabItem newTab = this.AddTabItem();

                tabDynamic.DataContext = _tabItems;

                tabDynamic.SelectedItem = newTab;
            }
            else
            {

            }
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            string tabName = (sender as Button).CommandParameter.ToString();

            var item = tabDynamic.Items.Cast<TabItem>().Where(i => i.Name.Equals(tabName)).SingleOrDefault();

            TabItem tab = item as TabItem;

            if (tab != null)
            {
                if (_tabItems.Count < 3)
                {
                    System.Windows.Application.Current.Shutdown();
                }
                else
                {
                    TabItem selectedTab = tabDynamic.SelectedItem as TabItem;

                    tabDynamic.DataContext = null;

                    _tabItems.Remove(tab);

                    tabDynamic.DataContext = _tabItems;

                    if (selectedTab == null || selectedTab.Equals(tab))
                    {
                        selectedTab = _tabItems[0];
                    }
                    tabDynamic.SelectedItem = selectedTab;
                }
            }
        }

        private void ChromiumWebBrowser_OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            Dispatcher.BeginInvoke((Action)(() =>
           {
               addbox.Text = e.Url;
               backree.IsEnabled = Browser.CanGoBack;
               navixd.IsEnabled = !string.IsNullOrWhiteSpace(addbox.Text);
               forwardyikes.IsEnabled = Browser.CanGoForward;
           }));
        }


        private void backree_Click(object sender, RoutedEventArgs e)
        {
            if (Browser.CanGoBack)
            {
                Browser.Back();
            }
        }

        private void navixd_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(addbox.Text))
            {
                Browser.Address = addbox.Text;
            }
        }

        private void forwardyikes_Click(object sender, RoutedEventArgs e)
        {
            if (Browser.CanGoForward)
            {
                Browser.Forward();
            }

        }
    }

感谢您的帮助,谢谢!

0 个答案:

没有答案
相关问题