Как я могу стилизовать пользовательский элемент управления, основываясь на том, имеет ли какой-либо из его дочерних элементов фокус? - PullRequest
8 голосов
/ 10 февраля 2011

У нас есть пользовательский холст, который имеет специализированные узлы, которые во многом похожи на окна стандартного MDI-приложения. Желаемое поведение состоит в том, что если какой-либо из дочерних элементов управления «окна» имеет фокус, то это «окно» называется активным.

Теперь свойство IsFocused, по-видимому, не каскадно, то есть если дочерний элемент управления имеет фокус, его контейнер также не настроен на «сфокусированный», поэтому мы не можем его использовать. По той же причине мы не можем установить свойство IsFocused для контейнера, так как я считаю, что это украдет его у дочернего элемента.

Моя единственная мысль - создать новый DP под названием HasChildWithFocus или что-то в этом роде, а затем в программном коде прослушать всплывающие события и установить этот флаг. Не уверен, что это лучший путь. (Мы можем реализовать это в виде комбинации прикрепленного свойства / прикрепленного поведения.)

Но, конечно, было бы намного лучше, если бы мы просто спросили у элемента управления: "Эй ... у вас или у кого-нибудь из ваших детей есть фокус?"

Так ты можешь?

1 Ответ

10 голосов
/ 10 февраля 2011

Вы можете использовать UIElement.IsKeyboardFocusWithin прямо так:

<Grid>
    <Grid.Resources>
        <Style x:Key="panelStyle" TargetType="Border">
            <Setter Property="BorderBrush" Value="PaleGoldenrod"/>
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="BorderBrush" Value="PaleGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>
    <UniformGrid Columns="2">
        <Border BorderThickness="10" Style="{StaticResource panelStyle}">
            <StackPanel>
                <TextBox Text="TextBox1"/>
                <TextBox Text="TextBox2"/>
            </StackPanel>
        </Border>
        <Border BorderThickness="10" Style="{StaticResource panelStyle}">
            <StackPanel>
                <TextBox Text="TextBox3"/>
                <TextBox Text="TextBox4"/>
            </StackPanel>
        </Border>
    </UniformGrid>
</Grid>

В этом примере граница, которая содержит элемент с фокусом клавиатуры, оформляется другой кистью границы.

...