Как получить стиль элемента управления, чтобы он указывал на его элемент управления при использовании триггера? - PullRequest
1 голос
/ 21 апреля 2019

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

Я хотел сократить свой код, поэтому я создал собственный стиль рамки, определяющий все, что мне нужно, и хотел применить его к каждой необходимой границе отмены, НО проблема в том, что он опирается на триггер данных, указывающий на имя элемента управления, отключенного для чтобы он появился, и теперь моя проблема в том, как лучше всего сказать стилю «проверить элемент управления в пределах сетки и проверить, включен ли он / отключен».

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

Другое решение, которое я имею в виду, состоит в том, чтобы зарегистрировать все необходимые элементы управления для события IsEnabled_Changed, выполнить поиск по одному из них и установить видимость последнего в зависимости от статуса первого IsEnabled.

Вот пример стиля:

<Style x:Key="CancelBorder_Style" TargetType="Border">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="CornerRadius" Value="{DynamicResource GlobalCornerRadius}"/>
    <Setter Property="Cursor" Value="No"/>
    <Setter Property="Visibility" Value="Collapsed"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=MiddleNameTB,Path=IsEnabled}" Value="False">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Вот пример границы и ее родного брата:

<Grid Style="{DynamicResource RegCtrlGrid_Style}" >
    <TextBox x:Name="MiddleNameTB" />
    <Border Style="{DynamicResource CancelBorder_Style}"/>
</Grid>

1 Ответ

0 голосов
/ 21 апреля 2019

Я изменил пару вещей, поскольку понял, что если они используют одни и те же стили, можно использовать триггер, который не предназначен для них.

Прежде всего, я создал Границу на своем ресурсе:

<Border x:Key="CancelBorder" x:Shared="False">
    <Border.Style>
        <Style TargetType="Border" >
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="CornerRadius" Value="{DynamicResource GlobalCornerRadius}"/>
            <Setter Property="Cursor" Value="No"/>
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Children[0].IsEnabled,RelativeSource={RelativeSource AncestorType=Grid}}" Value="False">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

Затем применил его к моему интерфейсу:

<Grid Grid.Row="2" Style="{DynamicResource RegCtrlGrid_Style}">
    <TextBox x:Name="MiddleNameTB"/>
    <StaticResource ResourceKey="CancelBorder"/>
</Grid>

Трюк использовал:

{Binding Path=Children[0].IsEnabled,RelativeSource={RelativeSource AncestorType=Grid}}

Где [0] основано на индексе детей под родителем

Большое спасибо Джейсону Фрэнку за его ответ на вопрос ( В WPF, есть ли способ привязать к свойствам братьев и сестер? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...