Нужно сосредоточиться на панели содержимого wpf - PullRequest
1 голос
/ 17 февраля 2010

Я переключаю шаблон содержимого ListViewItem в режиме выполнения, чтобы включить редактирование элемента. Для этого я показываю Panel с опциями Ok и Cancel, и мне нужно, чтобы пользователь выбрал любую из этих опций перед переходом на другой пункт. Я хочу, чтобы Panel вел себя как модальный Dialog. Есть предложения?

Advanced Спасибо, Das

1 Ответ

0 голосов
/ 20 февраля 2010

Вы можете попробовать прослушать событие 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;
    }
  }
}

Я делаю еще одну проверку, чтобы убедиться, что новая цель фокусировки принадлежит нашей панели. Если мы этого не сделаем, мы никогда не позволим фокусу уйти от текущего сфокусированного элемента. Стоит отметить, что этот подход не удерживает пользователя от нажатия на другие кнопки в пользовательском интерфейсе. Он просто держит фокус.

Надеюсь, это поможет.

Приветствия, Анвака.

...