277 lines
8.9 KiB
C#
277 lines
8.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Navigation;
|
|
using System.Windows.Shapes;
|
|
|
|
namespace BaiduSearchApp
|
|
{
|
|
/// <summary>
|
|
/// MainWindow.xaml 的交互逻辑
|
|
/// </summary>
|
|
public partial class MainWindow : Window
|
|
{
|
|
private int _currentPage = 1;
|
|
private int _pageSize = 10; // 每页显示10条结果
|
|
private int _totalItems = 0;
|
|
private int _totalPages = 1;
|
|
private string _currentQuery = string.Empty;
|
|
private BaiduSearchApi _searchApi;
|
|
private List<Reference> _allSearchResults = new List<Reference>(); // 存储所有搜索结果
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
// 初始化占位符可见性
|
|
txtApiKeyPlaceholder.Visibility = Visibility.Visible;
|
|
txtSearchQueryPlaceholder.Visibility = Visibility.Visible;
|
|
// 初始化 WebView2
|
|
InitializeWebView();
|
|
}
|
|
|
|
private void TxtApiKey_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
txtApiKeyPlaceholder.Visibility = string.IsNullOrEmpty(txtApiKey.Text) ? Visibility.Visible : Visibility.Collapsed;
|
|
}
|
|
|
|
private void TxtSearchQuery_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
txtSearchQueryPlaceholder.Visibility = string.IsNullOrEmpty(txtSearchQuery.Text) ? Visibility.Visible : Visibility.Collapsed;
|
|
}
|
|
|
|
private async void BtnSearch_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
await PerformSearchAsync();
|
|
}
|
|
|
|
private async void TxtSearchQuery_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.Key == Key.Enter)
|
|
{
|
|
await PerformSearchAsync();
|
|
}
|
|
}
|
|
|
|
private async Task PerformSearchAsync()
|
|
{
|
|
string apiKey = txtApiKey.Text.Trim();
|
|
string query = txtSearchQuery.Text.Trim();
|
|
|
|
if (string.IsNullOrEmpty(apiKey))
|
|
{
|
|
ShowErrorMessage("请先输入百度千帆API Key");
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(query))
|
|
{
|
|
ShowErrorMessage("请输入搜索内容");
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
txtStatus.Text = "正在搜索中...";
|
|
btnSearch.IsEnabled = false;
|
|
btnPrevPage.IsEnabled = false;
|
|
btnNextPage.IsEnabled = false;
|
|
lvSearchResults.Items.Clear();
|
|
|
|
_searchApi = new BaiduSearchApi(apiKey);
|
|
_currentQuery = query;
|
|
_currentPage = 1; // 重置为第一页
|
|
|
|
// 一次获取最多50条结果
|
|
SearchResponse response = await _searchApi.SearchAsync(query, 50);
|
|
|
|
if (response.References != null && response.References.Count > 0)
|
|
{
|
|
// 保存所有搜索结果
|
|
_allSearchResults = response.References;
|
|
_totalItems = _allSearchResults.Count;
|
|
|
|
// 计算总页数
|
|
_totalPages = (int)Math.Ceiling((double)_totalItems / _pageSize);
|
|
|
|
txtStatus.Text = $"找到 {_totalItems} 条结果";
|
|
|
|
// 显示当前页结果
|
|
ShowCurrentPageResults();
|
|
|
|
// 更新分页信息
|
|
UpdatePaginationInfo();
|
|
}
|
|
else
|
|
{
|
|
txtStatus.Text = "未找到相关结果";
|
|
_allSearchResults.Clear();
|
|
_totalItems = 0;
|
|
_totalPages = 1;
|
|
_currentPage = 1;
|
|
UpdatePaginationInfo();
|
|
}
|
|
}
|
|
catch (HttpRequestException ex)
|
|
{
|
|
ShowErrorMessage($"网络错误: {ex.Message}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ShowErrorMessage($"搜索失败: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
btnSearch.IsEnabled = true;
|
|
}
|
|
}
|
|
|
|
private void ShowErrorMessage(string message)
|
|
{
|
|
txtStatus.Text = message;
|
|
MessageBox.Show(message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
|
|
#region 分页相关方法
|
|
|
|
/// <summary>
|
|
/// 显示当前页的搜索结果
|
|
/// </summary>
|
|
private void ShowCurrentPageResults()
|
|
{
|
|
lvSearchResults.Items.Clear();
|
|
|
|
// 计算当前页的起始和结束索引
|
|
int startIndex = (_currentPage - 1) * _pageSize;
|
|
int endIndex = Math.Min(startIndex + _pageSize, _totalItems);
|
|
|
|
// 添加当前页的结果
|
|
for (int i = startIndex; i < endIndex; i++)
|
|
{
|
|
lvSearchResults.Items.Add(_allSearchResults[i]);
|
|
}
|
|
}
|
|
|
|
private void UpdatePaginationInfo()
|
|
{
|
|
// 更新分页信息
|
|
txtPageInfo.Text = $"第 {_currentPage} 页,共 {_totalPages} 页";
|
|
|
|
// 启用/禁用分页按钮
|
|
btnPrevPage.IsEnabled = _currentPage > 1;
|
|
btnNextPage.IsEnabled = _currentPage < _totalPages;
|
|
}
|
|
|
|
private void BtnPrevPage_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_currentPage > 1)
|
|
{
|
|
_currentPage--;
|
|
ShowCurrentPageResults();
|
|
UpdatePaginationInfo();
|
|
}
|
|
}
|
|
|
|
private void BtnNextPage_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_currentPage < _totalPages)
|
|
{
|
|
_currentPage++;
|
|
ShowCurrentPageResults();
|
|
UpdatePaginationInfo();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region WebView2 相关方法
|
|
|
|
private async void InitializeWebView()
|
|
{
|
|
// 初始化 WebView2
|
|
await webView.EnsureCoreWebView2Async();
|
|
|
|
// 设置 WebView2 事件
|
|
webView.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted;
|
|
webView.CoreWebView2.HistoryChanged += CoreWebView2_HistoryChanged;
|
|
}
|
|
|
|
private void CoreWebView2_NavigationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e)
|
|
{
|
|
// 更新地址栏
|
|
txtBrowserUrl.Text = webView.Source.ToString();
|
|
}
|
|
|
|
private void CoreWebView2_HistoryChanged(object sender, object e)
|
|
{
|
|
// 更新前进后退按钮状态
|
|
btnBack.IsEnabled = webView.CanGoBack;
|
|
btnForward.IsEnabled = webView.CanGoForward;
|
|
}
|
|
|
|
private void LvSearchResults_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
|
{
|
|
// 双击搜索结果项打开链接
|
|
if (lvSearchResults.SelectedItem is Reference selectedReference)
|
|
{
|
|
OpenUrlInBrowser(selectedReference.Url);
|
|
}
|
|
}
|
|
|
|
private void OpenUrlInBrowser(string url)
|
|
{
|
|
if (!string.IsNullOrEmpty(url) && webView.CoreWebView2 != null)
|
|
{
|
|
webView.CoreWebView2.Navigate(url);
|
|
}
|
|
}
|
|
|
|
private void BtnBack_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (webView.CanGoBack)
|
|
{
|
|
webView.GoBack();
|
|
}
|
|
}
|
|
|
|
private void BtnForward_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (webView.CanGoForward)
|
|
{
|
|
webView.GoForward();
|
|
}
|
|
}
|
|
|
|
private void BtnRefresh_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
webView.Reload();
|
|
}
|
|
|
|
private void BtnGo_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (!string.IsNullOrEmpty(txtBrowserUrl.Text) && webView.CoreWebView2 != null)
|
|
{
|
|
webView.CoreWebView2.Navigate(txtBrowserUrl.Text);
|
|
}
|
|
}
|
|
|
|
private void BtnCloseBrowser_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (webView.CoreWebView2 != null)
|
|
{
|
|
webView.CoreWebView2.NavigateToString("<html><body><h3>浏览器已关闭</h3><p>双击搜索结果项打开链接</p></body></html>");
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |