gpt4 book ai didi

wpf - 如何一起使用 IsKeyboardFocusWithin 和 IsSelected?

转载 作者:行者123 更新时间:2023-12-02 03:11:33 24 4
gpt4 key购买 nike

我为 ListBoxItems 定义了一个样式,并在 IsSelected 为 True 时使用触发器设置背景颜色:

    <Style x:Key="StepItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" Padding="0" SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="#40a0f5ff"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

即使 ListBoxListBoxItem 失去焦点,此样式也会保留所选项目,在我的情况下,这是绝对必须的。问题是,我还希望在 TextBox 的子项之一获得焦点时选择 ListBoxItem。为了实现此目的,我添加了一个触发器,当 IsKeyboardFocusWithin 为 true 时,将 IsSelected 设置为 true:

<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>

当我添加此触发器时,当焦点位于子 TextBox 上时,将选择该项目,但第一个行为消失了。现在,当我在 ListBox 外部单击时,该项目将被取消选择。

我怎样才能保留这两种行为?

最佳答案

当你的列表框失去焦点时,它会因为你的触发器而将所选项目设置为空。您可以使用一些隐藏的代码来选择焦点,当您失去焦点时,这些代码不会取消选择。

XAML:

<Window x:Class="SelectedTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">

<StackPanel>
<TextBox Text="Loose focus here" />
<ListBox Name="_listBox" ItemsSource="{Binding Path=Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" GotFocus="OnChildGotFocus">
<TextBox Text="{Binding .}" Margin="10" />
<TextBox Text="{Binding .}" Margin="10" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" SnapsToDevicePixels="true" Background="Transparent">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</StackPanel>
</Window>

隐藏代码:

private void OnChildGotFocus(object sender, RoutedEventArgs e) 
{
_listBox.SelectedItem = (sender as StackPanel).DataContext;
}

关于wpf - 如何一起使用 IsKeyboardFocusWithin 和 IsSelected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com