马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
功能说明
一个用于 WPF TextBox 的附加举动,实现 TextBox 与 Popup 控件的联动结果:
- 自动弹出/关闭:
- TextBox 获得核心时自动打开关联的 Popup
- TextBox 失去核心时自动关闭关联的 Popup
- 点击外部关闭:
- 点击 TextBox 和 Popup 外部区域时关闭 Popup
- 核心状态处置惩罚:
- 解决 TextBox 保持核心但 Popup 关闭后的重新触发问题
核心代码解析
- // 解决在 TextBox 外其他地方点击时,仅关闭 Popup,但是 TextBox 还是 Focused 状态,导致再点击进来时不会触发弹出 Popup
- private void AssociatedObject_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
- if (AssociatedObject?.IsFocused == true && Popup != null && !Popup.IsOpen) {
- Popup.IsOpen = true;
- }
- }
- private void Window_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
- if (Popup == null || !Popup.IsOpen || AssociatedObject == null || _parentWindow == null) { return; }
- Point position = e.GetPosition(null);
- Rect textBoxRect = new Rect(AssociatedObject.TranslatePoint(new Point(0, 0), _parentWindow), AssociatedObject.RenderSize);
- Rect popupRect = new Rect(Popup.TranslatePoint(new Point(0, 0), _parentWindow), Popup.RenderSize);
- if (!textBoxRect.Contains(position) && !popupRect.Contains(position)) {
- Popup.SetCurrentValue(Popup.IsOpenProperty, false);
- }
- }
复制代码 使用方法
- <TextBox x:Name="SearchBox"
- Width="400"
- Height="30"
- Text="{Binding ElementName=list, Path=SelectedItem.Content}">
- <hc:Interaction.Behaviors>
- <controls:TextBoxPopupBehavior Popup="{Binding ElementName=SuggestionsPopup}" />
- </hc:Interaction.Behaviors>
- </TextBox>
- <Popup x:Name="SuggestionsPopup"
- Placement="Bottom"
- PlacementTarget="{Binding ElementName=SearchBox}"
- StaysOpen="True">
- <Border Background="White"
- BorderBrush="Gray"
- BorderThickness="1">
- <ListBox x:Name="list"
- Width="200"
- Height="150">
- <ListBoxItem>选项1</ListBoxItem>
- <ListBoxItem>选项2</ListBoxItem>
- <ListBoxItem>选项3</ListBoxItem>
- </ListBox>
- </Border>
- </Popup>
复制代码 留意事项
- 确保 Popup 的 PlacementTarget 正确绑定
- 在 MVVM 模式下可通过绑定设置 Popup 属性
- 控件卸载时会自动清理事件监听
文章作者:Memento
博客地址:
版权声明:Memento所有文章遵循创作共用版权协议,要求署名、非贸易、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接情势注明出处。
|