XAML UserControl - установить фон на основе триггера - PullRequest
1 голос
/ 29 сентября 2011

У меня есть UserControl, который содержит Expander:

<UserControl x:Class="Client.DevicesExpander"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="devicesExpander" >

    <Expander Margin="1" Name="expander" FontSize="11" BorderThickness="1" BorderBrush="DarkRed" Foreground="Black" Header="{Binding ElementName=devicesExpander, Path=Header}" FontWeight="Bold" MouseDoubleClick="Expander_MouseDoubleClick" Expanded="Expander_Expanded" IsExpanded="{Binding ElementName=devicesExpander, Path=IsExpanded}" Background="{Binding ElementName=devicesExpander, Path=Background}">
        <StackPanel Name="_devicesPanel">
            <ListBox BorderThickness="0,1,0,0"  Name="_devicesList" FontWeight="Normal" MouseDoubleClick="DevicesList_MouseDoubleClick" Background="{Binding ElementName=devicesExpander, Path=Background}" />
        </StackPanel>
        <Expander.Style>
            <Style TargetType="{x:Type Expander}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=devicesExpander, Path=IsExpanded}" Value="True">
                        <Setter Property="Background" Value="White" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            </Expander.Style>
    </Expander>
</UserControl>

В основном все, что я хотел бы сделать, это изменить цвет фона Expander и StackPanel на основе IsExpanded UserControl (или Expander).

Я добавил три свойства зависимости в элемент управления:

    public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register("Header", typeof(string), typeof(DevicesExpander));
    public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register("IsExpanded", typeof(bool), typeof(DevicesExpander));
    public static readonly DependencyProperty BackgroundProperty = DependencyProperty.Register("Background", typeof(System.Windows.Media.Brush), typeof(DevicesExpander));

Но мой код не работает.Свойство IsExpanded из usercontrol работает, так как свойство изменяется соответствующим образом (при расширении расширителя) при проверке из окна, в котором находится usercontrol.

Как изменить цвет фона Expander, основываясь наСвойство UserControl.IsExpanded?

Спасибо!

РЕДАКТИРОВАТЬ: Тем временем я сделал следующее:

<UserControl.Resources>
        <Style TargetType="{x:Type UserControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=devicesExpander, Path=IsExpanded}" Value="True">
                    <Setter Property="Background" Value="White" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>

    <Expander Margin="1" Name="expander" FontSize="11" BorderThickness="1" BorderBrush="DarkRed" Foreground="Black" Header="{Binding ElementName=devicesExpander, Path=Header}" FontWeight="Bold" MouseDoubleClick="Expander_MouseDoubleClick" Expanded="Expander_Expanded" IsExpanded="{Binding ElementName=devicesExpander, Path=IsExpanded}" Background="Transparent">
        <StackPanel Name="_devicesPanel">
            <ListBox BorderThickness="0,1,0,0"  Name="_devicesList" FontWeight="Normal" MouseDoubleClick="DevicesList_MouseDoubleClick" Background="Transparent" />
        </StackPanel>
    </Expander>

и удалил свойство зависимости BackgroundProperty.Я действительно думал, что это может сработать, но увы ...

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Мне удалось решить мою проблему. При этом решение (с указанием только необходимого кода) ...

Свойство «Моя зависимость» создается следующим образом:

public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register("IsExpanded", typeof(bool), typeof(DevicesExpander));

public bool IsExpanded
{
    get { return (bool)GetValue(IsExpandedProperty); }
    set { SetValue(IsExpandedProperty, value); }
}

и мой XAML:

<UserControl x:Class="TestApp.DevicesExpander"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Name="devicesExpander">

    <Expander>
        <Expander.Style>
            <Style TargetType="Expander">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=devicesExpander, Path=IsExpanded}" Value="True">
                        <Setter Property="Background" Value="Black" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=devicesExpander, Path=IsExpanded}" Value="False">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Expander.Style>
    </Expander>
</UserControl>

В итоге было решено удалить свойство Backgroud из элемента и указать DataTrigger для IsExpanded = True и IsExpanded = False. Таким образом, создается впечатление, что свойство Background, указанное в свойствах элемента, переопределяет все, что триггеры пытались установить.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 30 сентября 2011

Приведено другое решение той же проблемы, на этот раз с использованием IValueConverter ...

Мой XAML:

  <UserControl.Resources>
        <local:BackgroundConverter x:Key="backgroundConvertor" />
    </UserControl.Resources>

    <Expander>
        <Expander.Style>
            <Style TargetType="Expander">
                <Setter Property="Background" Value="{Binding ElementName=devicesEntry, Path=IsExpanded, Converter={StaticResource backgroundConvertor}}" />
            </Style>
        </Expander.Style>
    </Expander>

и мой код для преобразователя значений:

public class BackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? "White" : "Transparent";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string color = value as string;

        if (color == "White")
            return true;

        return false;
    }
}

Я думаю, что я предпочитаю решение только на XAML, хотя опция IValueConverter обеспечивает немного лучшее чтение XAML ...

(Свойство DependancyProperty по-прежнему создается точно так же)

...