需要将重点放在wpf内容面板上

时间:2010-02-17 13:16:39

标签: wpf focus panel

我正在运行模式下切换ListViewItem的内容模板以启用项目编辑。为此,我显示带有“确认”和“取消”选项的Panel,我需要用户在转到另一个项目之前选择其中任何一个选项。我希望Panel的行为类似于模态Dialog。 有什么建议吗?

高级谢谢, DAS

1 个答案:

答案 0 :(得分:0)

您可以尝试收听PreviewLostKeyboardFocus事件,并在您不想让焦点消失时将其标记为已处理。这是一个例子。我们有两列,如果您将焦点放在第一列,则在您单击“释放焦点”按钮之前,您永远不会离开它:

<强> XAML

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Focus Sample" Height="300" Width="340">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <GroupBox Header="Press Release Focus to leave">
      <StackPanel PreviewLostKeyboardFocus="StackPanel_PreviewLostKeyboardFocus">
        <TextBox/>
        <Button Content="Release Focus"
                Click="ReleaseFocusClicked"/>
      </StackPanel>
    </GroupBox>
    <GroupBox Header="Try to switch focus here:"
              Grid.Column="1">
      <TextBox/>
    </GroupBox>
  </Grid>
</Window>

<强> C#

using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
  public partial class Window1 : Window
  {
    private bool _letGo;

    public Window1()
    {
      InitializeComponent();
    }

    private void StackPanel_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
      var uie = (UIElement) sender;
      var newFocusDO = (DependencyObject)e.NewFocus;
      if (!_letGo && !uie.IsAncestorOf(newFocusDO))
      {
        e.Handled = true;
      }
    }

    private void ReleaseFocusClicked(object sender, RoutedEventArgs e)
    {
      _letGo = true;
    }
  }
}

我正在做一次额外的检查,以确保新的焦点目标是否属于我们的面板。如果我们不这样做,我们永远不会让焦点离开当前关注的元素。值得一提的是,这种方法不会阻止用户点击UI中的其他按钮。它只是关注焦点。

希望这有帮助。

干杯,安瓦卡。