using HeBianGu.Base.WpfBase; using HeBianGu.Control.Explorer; using HeBianGu.General.WpfControlLib; using Hopetry.Provider.Behaviors; using Minio.DataModel.Args; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; namespace Hopetry.Provider.Behaviors { public class MinIOSearchBehavior : Behavior { #region //private ExplorerMinIOBehavior _minioBehavior; //private TextBox _searchBox; //private DispatcherTimer _searchDebounceTimer; //protected override void OnAttached() //{ // base.OnAttached(); // AssociatedObject.Loaded += (s, e) => // { // _minioBehavior = Interaction.GetBehaviors(AssociatedObject) // .OfType() // .FirstOrDefault(); // _searchBox = FindSearchBox(); // if (_searchBox != null) // { // // 移除原来的 TextChanged 事件 // //_searchBox.TextChanged -= OnSearchTextChanged; // // 改为监听 KeyDown 事件 // _searchBox.KeyDown += OnSearchKeyDown; // } // }; //} //private void OnSearchKeyDown(object sender, KeyEventArgs e) //{ // // 如果按下的是 Enter 键,才执行搜索 // if (e.Key == Key.Enter) // { // if (_minioBehavior == null || !_minioBehavior.UseMinIO || _searchBox == null) // return; // string searchText = _searchBox.Text; // if (!string.IsNullOrEmpty(searchText)) // { // _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath, searchText); // } // else // { // _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath); // } // } //} //private TextBox FindSearchBox() //{ // var searchBox = FindVisualChildren(AssociatedObject) // .FirstOrDefault(tb => // tb.Style == AssociatedObject.FindResource(TextBoxKeys.ClearSingle) as Style && // BindingOperations.GetBindingExpression(tb, TextBox.TextProperty)?.ParentBinding?.Path?.Path == "AllSearchPattern" // ); // if (searchBox != null) // { // // 1. 移除默认的 TextChanged 绑定 // BindingOperations.ClearBinding(searchBox, TextBox.TextProperty); // // 2. 阻止 Explorer 内部更新 AllSearchPattern // AssociatedObject.AllSearchPattern = null; // 清空默认值 // // 3. 改为手动处理 Enter 键搜索 // searchBox.KeyDown += OnSearchKeyDown; // } // return searchBox; //} //private static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject //{ // if (depObj != null) // { // for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) // { // DependencyObject child = VisualTreeHelper.GetChild(depObj, i); // if (child != null && child is T t) // { // yield return t; // } // foreach (T childOfChild in FindVisualChildren(child)) // { // yield return childOfChild; // } // } // } //} //protected override void OnDetaching() //{ // if (_searchBox != null) // { // _searchBox.KeyDown -= OnSearchKeyDown; // } // base.OnDetaching(); //} #endregion #region ceshi private ExplorerMinIOBehavior _minioBehavior; private TextBox _searchBox; private bool _isHandlingSearch; // 防止递归调用 private bool _suppressTextChanged; protected override void OnAttached() { base.OnAttached(); AssociatedObject.Loaded += OnExplorerLoaded; } private void OnExplorerLoaded(object sender, RoutedEventArgs e) { _minioBehavior = Interaction.GetBehaviors(AssociatedObject) .OfType() .FirstOrDefault(); _searchBox = FindSearchBox(); if (_searchBox != null) { // 完全接管搜索框 TakeOverSearchBox(); } } private void TakeOverSearchBox() { // 2. 清除所有可能影响搜索的绑定 BindingOperations.ClearAllBindings(_searchBox); // 2. 接管TextChanged事件 _searchBox.TextChanged -= OnSearchTextChanged; _searchBox.TextChanged += OnSearchTextChanged; // 3. 阻止Explorer内部处理搜索 AssociatedObject.AllSearchPattern = null; // 4. 确保初始状态 _searchBox.Text = ""; // 5. 只保留我们的KeyDown处理 _searchBox.KeyDown -= OnSearchKeyDown; _searchBox.KeyDown += OnSearchKeyDown; // 4. 确保初始状态 _searchBox.Text = ""; // 确保不会触发默认搜索 //_searchBox.SetCurrentValue(TextBox.TextProperty, ""); } private void OnSearchTextChanged(object sender, TextChangedEventArgs e) { string searchText = _searchBox.Text.Trim(); if (!string.IsNullOrEmpty(searchText)) { _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath, searchText); } else { _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath); } } private void OnSearchKeyDown(object sender, KeyEventArgs e) { if (e.Key != Key.Enter || _isHandlingSearch) return; _isHandlingSearch = true; try { if (_minioBehavior == null || !_minioBehavior.UseMinIO || _searchBox == null) return; string searchText = _searchBox.Text.Trim(); // 确保CurrentPath有效 if (string.IsNullOrEmpty(AssociatedObject.CurrentPath)) { // 设置一个默认路径,避免显示根目录 AssociatedObject.CurrentPath = ""; // 替换为你的MinIO默认路径 } if (!string.IsNullOrEmpty(searchText)) { _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath, searchText); } else { _minioBehavior.RefreshMinIOPath(AssociatedObject.CurrentPath); } } finally { _isHandlingSearch = false; } } private TextBox FindSearchBox() { return FindVisualChildren(AssociatedObject) .FirstOrDefault(tb => tb.Style == AssociatedObject.FindResource(TextBoxKeys.ClearSingle) as Style && BindingOperations.GetBindingExpression(tb, TextBox.TextProperty)?.ParentBinding?.Path?.Path == "AllSearchPattern" ); } private static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { if (depObj == null) yield break; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { var child = VisualTreeHelper.GetChild(depObj, i); if (child is T t) yield return t; foreach (var childOfChild in FindVisualChildren(child)) yield return childOfChild; } } protected override void OnDetaching() { if (_searchBox != null) { _searchBox.KeyDown -= OnSearchKeyDown; _searchBox.TextChanged -= OnSearchTextChanged; } AssociatedObject.Loaded -= OnExplorerLoaded; base.OnDetaching(); } #endregion } }