Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF的单独选项卡中显示不同页面时出现问题_C#_Wpf_Cefsharp - Fatal编程技术网

C# 在WPF的单独选项卡中显示不同页面时出现问题

C# 在WPF的单独选项卡中显示不同页面时出现问题,c#,wpf,cefsharp,C#,Wpf,Cefsharp,我试图在WPF中创建一个带有选项卡的浏览器,我有动态选项卡,但每当我创建一个新选项卡时,它都会将所有选项卡设置为默认地址(duckduckgo.com),我如何为每个选项卡显示不同的网页 我有一个带有“后退”和“前进”按钮的导航栏,我还想知道如何使“前进”和“后退”选项成为选项卡的专用选项,我想我不必使用诸如浏览器之类的东西了 守则: XAML: <Grid.RowDefinitions> <RowDefinition Height="a

我试图在WPF中创建一个带有选项卡的浏览器,我有动态选项卡,但每当我创建一个新选项卡时,它都会将所有选项卡设置为默认地址(duckduckgo.com),我如何为每个选项卡显示不同的网页

我有一个带有“后退”和“前进”按钮的导航栏,我还想知道如何使“前进”和“后退”选项成为选项卡的专用选项,我想我不必使用诸如浏览器之类的东西了

守则:

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#:

公共部分类主窗口:窗口
{
私人物品清单;
私有选项卡项_tabAdd;
公共主窗口()
{
尝试
{
初始化组件();
_tabItems=新列表();
_tabAdd=新TabItem();
_tabAdd.Header=“+”;
_tabAdd.MouseLeftButtonUp+=新的MouseButtonEventHandler(tabAdd_MouseLeftButtonUp);
_tabItems.Add(_tabAdd);
this.AddTabItem();
tabDynamic.DataContext=\u tabItems;
tabDynamic.SelectedIndex=0;
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私有TabItem AddTabItem()
{
int count=\u tabItems.count;
TabItem tab=新TabItem();
tab.Header=string.Format(“tab{0}”,count);
tab.Name=string.Format(“tab{0}”,count);
tab.HeaderTemplate=tabDynamic.FindResource(“TabHeader”)作为数据模板;
Browser.Address=“duckduckgo.com”;
_tabItems.Insert(计数-1,tab);
返回选项卡;
}
私有无效选项卡Add_MouseLeftButtonUp(对象发送器,MouseButtonEventArgs e)
{
tabDynamic.DataContext=null;
TabItem tab=this.AddTabItem();
tabDynamic.DataContext=\u tabItems;
tabDynamic.SelectedItem=tab;
}
私有无效选项卡动态\u选择已更改(对象发送方,选择已更改发送标记e)
{
TabItem tab=tabDynamic.SelectedItem作为TabItem;
如果(tab==null)返回;
如果(制表符等于(_tabAdd))
{
tabDynamic.DataContext=null;
TabItem newTab=this.AddTabItem();
tabDynamic.DataContext=\u tabItems;
tabDynamic.SelectedItem=newTab;
}
其他的
{
}
}
私有无效BTN删除\单击(对象发送方,路由目标)
{
字符串tabName=(发送者为按钮).CommandParameter.ToString();
var item=tabDynamic.Items.Cast();
TabItem tab=项目作为TabItem;
如果(制表符!=null)
{
如果(_tabItems.Count<3)
{
System.Windows.Application.Current.Shutdown();
}
其他的
{
TabItem selectedTab=tabDynamic.SelectedItem作为TabItem;
tabDynamic.DataContext=null;
_tabItems.Remove(tab);
tabDynamic.DataContext=\u tabItems;
如果(selectedTab==null | | selectedTab.Equals(制表符))
{
selectedTab=_选项卡项[0];
}
tabDynamic.SelectedItem=selectedTab;
}
}
}
私有void ChromiumWebBrowser_OnFrameLoadEnd(对象发送方,FrameLoadEndEventArgs e)
{
Dispatcher.BeginInvoke((操作)(()=>
{
addbox.Text=e.Url;
backree.IsEnabled=Browser.CanGoBack;
navixd.IsEnabled=!string.IsNullOrWhiteSpace(addbox.Text);
forwardyikes.IsEnabled=Browser.CanGoForward;
}));
}
私有无效回退单击(对象发送者,路由目标)
{
if(Browser.CanGoBack)
{
Browser.Back();
}
}
私有void navixd_单击(对象发送方,路由目标)
{
如果(!string.IsNullOrWhiteSpace(addbox.Text))
{
Browser.Address=addbox.Text;
}
}
私有void forwardyikes_Click(对象发送方,路由目标)
{
if(Browser.CanGoForward)
{
Browser.Forward();
}
}
}

感谢您的帮助,谢谢

您的浏览器实际上不是选项卡的一部分。它是在外面定义的,这是你的意图吗?封装浏览器和所有相关按钮/字段的简单方法是创建一个UserControl。基于此代码,选项卡和浏览器似乎是完全断开连接的实体。我认为一个好的开始是在每个标签上存储当前地址(可能还有导航历史)等信息;这可能意味着您必须创建自己的类来继承TabItem(即BrowserTabItem:TabItem),您可以在其中创建和设置这些属性。然后,当TabControl的选定选项卡发生更改时,让浏览器导航到选定选项卡的存储地址。当然,还有其他方法可以做到这一点,这只是一个例子。通常的方法是每个选项卡一个ChromiumWebBrowser实例。使用单个实例和navi
    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();
            }

        }
    }