0

У меня есть 3 кнопки по нажатии которых, в DataGrid под ними отображаются соответствующие им таблицы. IsFocused каждой кнопки обозначается изменением цвета ее BorderBrush. Мне нужно, чтобы выделение кнопки сохранялось, до момента пока я не нажму кнопку переключения на другую таблицу.

Сами кнопки:

<StackPanel Grid.Row="2" Orientation="Horizontal" Margin="0 20 0 0">
    <Button x:Name="btnTable1" Content="Таблица 1" Command="{Binding ShowTable1Command}" Style="{StaticResource tabButton}" Width="100"/>
    <Button x:Name="btnTable2" Content="Таблица 2" Command="{Binding ShowTable2Command}" Style="{StaticResource tabButton}" />
    <Button x:Name="btnTable3" Content="Таблица 3" Command="{Binding ShowTable3Command}" Style="{StaticResource tabButton}"/>
</StackPanel>

Стиль кнопок:

<Style x:Key="tabButton" TargetType="Button">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Foreground" Value="#121518"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="Width" Value="120" />
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Height" Value="45" />
    <Setter Property="FontSize" Value="14" />
    <Setter Property="FontWeight" Value="SemiBold" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Background="{TemplateBinding Background}" BorderThickness="0 0 0 3" BorderBrush="{TemplateBinding BorderBrush}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
&lt;Style.Triggers&gt;
    &lt;Trigger Property=&quot;IsMouseOver&quot; Value=&quot;True&quot;&gt;
        &lt;Setter Property=&quot;BorderBrush&quot; Value=&quot;#784ff2&quot;/&gt;
    &lt;/Trigger&gt;
    &lt;Trigger Property=&quot;IsFocused&quot; Value=&quot;True&quot;&gt;
        &lt;Setter Property=&quot;BorderBrush&quot; Value=&quot;#784ff2&quot;/&gt;
    &lt;/Trigger&gt;
&lt;/Style.Triggers&gt;

</Style>

Я пытался:

  • Использовать файл xaml.cs для определения логики поведения при возникновении событий Got/Lost focus.
  • Создать 3 динамическиx ресурса <SolidColorBrush Color="Transparent"... "borderBrush1", "borderBrush2", "borderBrush3" и для каждой кнопки переопределить стиль (BasedOn tabButton) с присвоением каждой определенного BorderBrush. Чтобы затем в обработчиках событий рас/фокусировки просто менять цвета.

Варианты выше результата не дали, Фокусировка все равно сбивалась в какой-то момент и начинала пропадать при попытке взаимодействия с любыми другими элементами.

Я плохо понимаю как работает FocusVisualStyle. Из документации, с моим уровнем работы с wpf, полезного мало что смог вынести. Решается ли задача с его использованием? Также слабо понимаю Xaml.Behaviors, Решается ли задача преимущественно с их использованием?

  • 1
    Фокус - это элемент, с которым в данный момент работает пользоваетель. Вы используете фокус не по назначению. Чтобы сохранить фокус на одном элементе, нужно просто запретить получение фокуса на всех остальных элементах управления. Почему бы не использовать например просто ListBox вместо всего этого? https://ru.stackoverflow.com/a/1266479/373567 – aepot Nov 05 '22 at 16:37
  • 1
    По ссылке показан ListBox, а у вас просто 3 кнопки. Переделайте на ListBox, стилизуйте выбранный элемент, и проблема фокуса решится сама собой. Чтобы запретить получение фокуса, нужно в xaml задать элементу Focusable="False", очень просто. – aepot Nov 05 '22 at 17:08
  • https://ru.stackoverflow.com/a/691259/220553 – EvgeniyZ Nov 05 '22 at 17:10

0 Answers0