Подтвердить что ты не робот

Как программно выбрать сфокусированный элемент?

Существует страница, на которой есть несколько элементов с фокусировкой (Кнопки, Изображения,...), созданные в статическом виде в XAML, некоторые из которых динамически находятся в коде. На этой странице нажатие клавиши вкладок сделает элементы сфокусированными один за другим. Это означает, что пунктирная линия отображается вокруг текущего элемента. Теперь я хотел бы сделать текущий сфокусированный элемент, выбранный тоже. Это означает, что вокруг него тоже будет показана синеватая линия. Таким образом, как сфокусированные движения, так и выбранный

Как я могу это сделать в коде С#?

введите описание изображения здесь

4b9b3361

Ответ 1

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

<UserControl.Resources>
    <Style TargetType="ListBoxItem">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="Selector.IsSelected" Value="True"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<ListBox>
    <ListBoxItem>
        Blah
    </ListBoxItem>
</ListBox>

Подобный триггер стиля может применяться и для других настраиваемых и выбираемых элементов.

Ответ 2

Отредактировано:

Я думаю, что вам просто нужно изменить пунктирную линию на TabStop. Эта ломаная линия указывает на выбранное состояние. Итак, он уже выбран. Это выражение "выбрать сфокусированный элемент" не имеет никакого смысла, поскольку, если вы ссылаетесь на TabStop, он действительно уже выбран. Вы можете протестировать его, нажав на вкладку, а затем, в зависимости от того, какая точка имеет пунктирную линию, если она нажата и нажмите Enter, она будет делать событие Click (если за ним когда-либо был обработчик).

Что вам нужно, this.

Если вы хотите сделать это в коде позади, добавьте это в ресурс вашего XAML.

<Style x:Key="MyFocusVisual">
      <Setter Property="Control.Template">
          <Setter.Value>
              <ControlTemplate>
                   <Rectangle Margin="-2" StrokeThickness="1" Stroke="Blue" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>
....
 myButton.FocusVisualStyle = (Style)FindResource("MyFocusVisual");

Если у вас нет доступа к XAML, я думаю, что вы можете понять, как добавить стиль в код-код и добавить стиль к кнопке. Теперь, я, очевидно, противоречу себе здесь, так как вы нацелены на кодовое отставание, невозможно не иметь доступа к XAML правильно? По-прежнему практично добавлять это через XAML, кроме кода.

Ответ 3

Я бы удостоверился, что каждый элемент является либо кнопкой, либо шаблоном кнопки. Таким образом можно использовать "IsTabStop", или элементы могут быть сфокусированы. Используя решение MrsEd, вы можете получить элемент с правильной границей:

<Button x:Class="Visualisation.UserControlButtonImage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             IsTabStop="True">
    <Button.Template>
        <ControlTemplate>
           <Grid>
               <Image/> 
           </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

Ответ 4

Что я сделал в xml. Я добавил PreviewGotKeyboardFocus в мое окно

             PreviewGotKeyboardFocus="FrmBase_OnPreviewGotKeyboardFocus"

Используйте PreviewGotKeyboardFocus в корневом элементе (usercontrol или window), чтобы обрабатывать событие фокусировки для каждого дочернего элемента управления.

Код за

private void FrmBase_OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    try
    {
        dynamic item = e.NewFocus;
        item.IsSelected = true;
    }
    catch (Exception ex)
    {

    }
}

Ответ 5

Тип элементов, на которые вы ссылаетесь, не все выбирается.

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

protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
    var focusedElement = e.Source as IInputElement;
    // Do something here
}