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