Изменение цвета фона WPF StackPanel, когда элемент на панели находится в фокусе

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

Спасибо!

<StackPanel Margin="5">
    <StackPanel.Style>
    <Style TargetType="{x:Type StackPanel}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsFocused, ElementName=chkOccupiedByMortgagor}" Value="true">
                <Setter Property="Background" Value="Gray" />
                <Setter Property="Opacity" Value=".5" />
            </DataTrigger>
            <DataTrigger Binding="{Binding IsFocused, ElementName=chkOccupiedByNewOwner}" Value="true">
                <Setter Property="Background" Value="Gray" />
                <Setter Property="Opacity" Value=".5" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</StackPanel.Style>
<CheckBox Margin="2" x:Name="chkOccupiedByMortgagor">Mortgagor</CheckBox>
<CheckBox Margin="2" x:Name="chkOccupiedByNewOwner">New Owner</CheckBox>
<CheckBox Margin="2" x:Name="chkOccupiedByTenant">Tenant</CheckBox>
<CheckBox Margin="2" x:Name="chkOccupiedByUnknownOccupant">Unknown Occupant</CheckBox>
</StackPanel> 

person Todd Fisher    schedule 28.09.2010    source источник


Ответы (1)


да. Вы можете сделать это. Просто используйте свойство IsKeyboardFocusWithin для триггера, например это:

<StackPanel Margin="5">
    <StackPanel.Style>
        <Style TargetType="{x:Type StackPanel}">
            <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin}" Value="True">
                    <Setter Property="Background" Value="Gray" />
                    <Setter Property="Opacity" Value=".5" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Style>
    <CheckBox Margin="2">Mortgagor</CheckBox>
    <CheckBox Margin="2">New Owner</CheckBox>
    <CheckBox Margin="2">Tenant</CheckBox>
    <CheckBox Margin="2">Unknown Occupant</CheckBox>
</StackPanel>

Однако помните, что вам нужно указать триггеру искать свойство в том же элементе, следовательно, RelativeSource={RelativeSource Self}. В качестве альтернативы вы можете назвать панель стека и также использовать этот xaml:

<StackPanel Margin="5" x:Name="stackPanel">
    ...
                <DataTrigger Binding="{Binding ElementName=stackPanel, Path=IsKeyboardFocusWithin}" Value="True">
    ...
person Yogesh    schedule 28.09.2010
comment
Прохладный! Именно то, что я искал! Большое спасибо! - person Todd Fisher; 30.09.2010