Я пытаюсь сделать браузер с вкладками в WPF, у меня есть динамические c вкладки, но всякий раз, когда я делаю новые вкладки, он делает все вкладки адресом по умолчанию (duckduck go .com), как бы я отображал разные веб-страницы для каждой вкладки?
У меня есть панель навигации с кнопками назад и вперед и go, и я также хотел бы знать, как сделать опции вперед и назад эксклюзивными для вкладок, я бы предпочел вместо использования таких вещей, как Браузер .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="<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#:
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();
}
}
}
Любая помощь приветствуется, спасибо!