Задать вопрос

Как при наведении курсора на UserControl изменить свойства элементов внутри её?

Есть у меня такой элемент UserControl с определённым содержимым. У меня он добавляется в стековую панель (StackPanel). Вот мне нужно, чтобы при наведении курсора поменялись свойства элементов внутри UserControl на уровне WPX/XAML. Можно, конечно, это проделать на C#. Но хотелось бы проделать сразу на уровне XAML в словаре ресурсов.

P.S. Мне удалось это сделать.

<!--Element, TextBlock, ListDevices-->
    <Style TargetType="{x:Type TextBlock}" x:Key="ElementText">
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="FontFamily" Value="Segoe UI"/>
        <Setter Property="FontWeight" Value="Medium"/>
        <Setter Property="Padding" Value="6"/>
        <Setter Property="TextAlignment" Value="Center"/>
    </Style>

    <!--Element, Border, ListDevices-->
    <Style TargetType="{x:Type Border}" x:Key="ElementBorder">
        <Setter Property="Background" Value="{Binding Background, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"/>
        <Setter Property="Opacity" Value="0.25"/>
        <Setter Property="local:Status.IsValue" Value="{Binding IsValue}"/>
        <!--<Style.Triggers>
            --><!--<Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Opacity" Value="0.75"/>
            </Trigger>--><!--

        </Style.Triggers>-->
    </Style>
    
    <!--Element, ListDevices-->
    <Style TargetType="{x:Type UserControl}" x:Key="Element">
        <Setter Property="Background" Value="{Binding Background, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}}"/>
        <Setter Property="Foreground" Value="{Binding Foreground, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}}"/>
        <Setter Property="Opacity" Value="0.75"/>
        <Setter Property="local:Status.IsStatus" Value="{Binding IsStatus}"/>
        <Setter Property="local:Status.IsValue" Value="{Binding IsValue}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type UserControl}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="8"/>
                            <ColumnDefinition Width="13*"/>
                            <ColumnDefinition Width="5*"/>
                            <ColumnDefinition Width="40"/>
                        </Grid.ColumnDefinitions>
                        <Border Grid.Column="0" x:Name="Bullet" Style="{StaticResource ElementBorder}"/>

                        <Border Grid.Column="1" x:Name="ElementSpace" Grid.ColumnSpan="4" Style="{StaticResource ElementBorder}"/>

                        <TextBlock Grid.Column="1" TextAlignment="Left" Text="Проверка" x:Name="NameDevice" Style="{StaticResource ElementText}"/>

                        <ComboBox Grid.Column="2" SelectedIndex="0" Padding="6">
                            <ComboBoxItem Content="C1"/>
                            <ComboBoxItem Content="C2/M"/>
                        </ComboBox>

                        <TextBlock Grid.Column="3" Text="&#x2757;&#x1F514;" Style="{StaticResource ElementText}"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="local:Status.IsValue" Value="true">
                            <Setter TargetName="Bullet" Property="Opacity" Value="0.95"/>
                            <Setter TargetName="ElementSpace" Property="Opacity" Value="0.45"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="Bullet" Property="Opacity" Value="0.95"/>
                            <Setter TargetName="ElementSpace" Property="Opacity" Value="0.45"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="local:Status.IsStatus" Value="0">
                <Setter Property="Background" Value="#FFDBD7D2"/>
                <Setter Property="Foreground" Value="#FFDBD7D2"/>
            </Trigger>
            <Trigger Property="local:Status.IsStatus" Value="1">
                <Setter Property="Background" Value="#FF50C878"/>
                <Setter Property="Foreground" Value="#FF50C878"/>
            </Trigger>
            <Trigger Property="local:Status.IsStatus" Value="2">
                <Setter Property="Background" Value="#FFFFD700"/>
                <Setter Property="Foreground" Value="#FFFFD700"/>
            </Trigger>
            <Trigger Property="local:Status.IsStatus" Value="3">
                <Setter Property="Background" Value="#FFFF2400"/>
                <Setter Property="Foreground" Value="#FFFF2400"/>
            </Trigger>
            <Trigger Property="local:Status.IsStatus" Value="4">
                <Setter Property="Background" Value="#FF7FC7FF"/>
                <Setter Property="Foreground" Value="#FF7FC7FF"/>
            </Trigger>
            <!--<Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Background" Value="#FF7FC7FF"/>
                <Setter Property="Foreground" Value="#FF7FC7FF"/>
            </Trigger>-->
        </Style.Triggers>
    </Style>


Осталось только решить небольшую проблему. Как забиндить значение local:Status.IsValue из UserControl в ControlTemplate? А то у меня выбрасывает ошибку на код:
<Trigger Property="local:Status.IsValue" Value="true">
                            <Setter TargetName="Bullet" Property="Opacity" Value="0.95"/>
                            <Setter TargetName="ElementSpace" Property="Opacity" Value="0.45"/>
                        </Trigger>
  • Вопрос задан
  • 254 просмотра
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
@AquariusStar Автор вопроса
Проблема решилась. Оказалось, что ошибка типов в классе DependencyObject. А решение: вышеприведённый код.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы