问题描述
我为我的ListBoxItems
定义了一种样式,当IsSelected
为True时,它会触发设置背景颜色:
I have a style defined for my ListBoxItems
with a trigger to set a background color when IsSelected
is 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>
即使ListBox
和ListBoxItem
失去焦点,这种样式仍会保留选定的项目,在我看来,这是绝对必要的.问题在于,我也希望在ListBoxItem
的子对象之一被选中时选择ListBoxItem
.为此,我添加了一个触发器,当IsKeyboardFocusWithin
为true时将IsSelected
设置为true:
This style maintains the selected item even when the ListBox
and ListBoxItem
loses focus, which in my case is an absolute must.The problem is that I also want the ListBoxItem
to be selected when one of its TextBox
's child gets focused. To achieve this I add a trigger that sets IsSelected
to true when IsKeyboardFocusWithin
is true:
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
当我添加此触发器时,当焦点位于子TextBox
上时,该项目已选中,但第一个行为消失了.现在,当我在ListBox
之外单击时,该项目将被取消选择.
When I add this trigger the Item is selected when the focus is on a child TextBox
, but the first behaviour disappears. Now when I click outside the ListBox
, the item is de-selected.
如何保持两种行为?
推荐答案
当列表框失去焦点时,由于触发,它将选择的项目设置为null.您可以使用后面的一些代码选择焦点,当您失去焦点时,这些代码不会取消选择.
When your listbox looses focus, it will set selected item to null because of your trigger. You can select on focus using some code behind that will not unselect when you loose focus.
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;
}
这篇关于如何一起使用IsKeyboardFocusWithin和IsSelected?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!