WPF Изменить цвет в Xaml на основе кода за свойством - PullRequest
2 голосов
/ 28 июня 2010

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

Спасибо!

<UserControl.Resources>
    <!-- Normal -->
    <SolidColorBrush x:Key="Normal_bg_Unselect" Color="#FF1A73CC" />
    <SolidColorBrush x:Key="Normal_fg_Unselect" Color="#FF72BAFF" />
    <SolidColorBrush x:Key="Normal_bg_Select" Color="#FF1ACCBF" />
    <SolidColorBrush x:Key="Normal_fg_Select" Color="#FF91FFFF" />


</UserControl.Resources>


<Grid>
    <Label Name="BackgroundLabel" Width="Auto" Height="Auto" BorderThickness="0" Panel.ZIndex="1" Cursor="Hand">
        <Label.Foreground>
            <SolidColorBrush Color="{DynamicResource Color_LightBlue}"/>
        </Label.Foreground>
        <Label.Style>
            <Style TargetType="{x:Type Label}">
                <Setter Property="Background" Value="{Binding BgUnselect}" />
                <Setter Property="Foreground" Value="{Binding FgUnselect}" />
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="{Binding BgSelect}" />
                        <Setter Property="Foreground" Value="{Binding FgSelect}" />
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="False">
                        <Setter Property="Background" Value="{Binding BgUnselect}" />
                        <Setter Property="Foreground" Value="{Binding FgUnselect}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Label.Style>
        <Label.OpacityMask>
            <LinearGradientBrush>
                <GradientStop Color="#00FFFFFF" Offset="-.35"/>
                <GradientStop Color="#FFFFFFFF" Offset="1"/>
            </LinearGradientBrush>
        </Label.OpacityMask>
    </Label>
    <TextBlock Name="ContentLabel" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, FallbackValue='Styled Button'}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0" FontFamily="/HarringtonGroup.TrainingBuilder;component/Fonts/#HelveticaNeue" FontSize="30" Foreground="{Binding ElementName=BackgroundLabel, Path=Foreground}" />
</Grid>

Код позади

    public SolidColorBrush BgUnselect { get; set; }
    public SolidColorBrush FgUnselect { get; set; }
    public SolidColorBrush BgSelect { get; set; }
    public SolidColorBrush FgSelect { get; set; }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        switch (ButtonType)
        {
            case ButtonType.Normal:
                BgUnselect = (SolidColorBrush)FindResource("Normal_bg_Unselect");
                FgUnselect = (SolidColorBrush)FindResource("Normal_fg_Unselect");
                BgSelect = (SolidColorBrush)FindResource("Normal_bg_Select");
                FgSelect = (SolidColorBrush)FindResource("Normal_fg_Select");
                return;

            case ButtonType.OK:

            case ButtonType.Cancel:
                return;
        }

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Ваш тег привязки является неполным, вы должны определить RelativeSource или ElementName

Измените свой UserControl, как показано ниже

<UserControl x:Name="userControl"

И применить привязку как,

Value="{Binding BgSelect, ElementName=userControl}"

По умолчанию привязка ищет BgSelect как свойство свойства «DataContext» пользовательского элемента управления.

Кроме того, поскольку UserControl является производным от DependencyObject, это не будет работать, если ваше свойство BgSelect и т. Д. Не является свойствами зависимости.

0 голосов
/ 28 июня 2010

Мне кажется, что все, что вы хотите сделать, это установить свойства Foreground и Background для ресурсов, которые вы определили.

Вы пытались заменить код {Binding ...} на {StaticResource ...}?

Например, изменить

<Setter Property="Background" Value="{Binding BgUnselect}" /> 

до

<Setter Property="Background" Value="{StaticResource Normal_bg_Unselect}" />

РЕДАКТИРОВАТЬ ниже (на основе комментария)

Вы можете использовать стили для управления набором из 4 цветов для каждого типа кнопок. Я создал небольшой надуманный пример, который вы могли бы применить к своему коду. Если не понятно, попробую переписать для вашего примера кода.

Создать базовый стиль:

<Style x:Key="LabelStyleBase" TargetType="{x:Type Label}">
    <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/>
    <Setter Property="Background" Value="{DynamicResource BackgroundBrush}"/>
        <!-- more style settings -->
</Style>

Затем создайте свои варианты:

<Style x:Key="LabelStyle1" BasedOn="{StaticResource LabelStyleBase}" TargetType="{x:Type Label}">
    <Style.Resources>
        <SolidColorBrush x:Key="ForegroundBrush" Color="Purple" />
        <SolidColorBrush x:Key="BackgroundBrush" Color="Pink" />    
    </Style.Resources>
</Style> 

<Style x:Key="LabelStyle2" BasedOn="{StaticResource LabelStyleBase}" TargetType="{x:Type Label}">
    <Style.Resources>
        <SolidColorBrush x:Key="ForegroundBrush" Color="Aqua" />
        <SolidColorBrush x:Key="BackgroundBrush" Color="Yellow" />  
    </Style.Resources>
</Style>

Вы можете получить предупреждение, что ресурсы не могут быть найдены, но это должно быть хорошо.

Альтернативный раствор

Наконец, если вы не хотите идти по этому пути, вам, возможно, придется реализовать INotifyPropertyChanged в классе и переписать ваши установщики в свойствах кисти, чтобы запустить событие NotifyPropertyChanged.

Немного неясно, как именно вы реализуете пользовательский элемент управления Button, но вы, вероятно, должны иметь перечисление типа кнопки, выставленное как DependencyProperty, и менять цветовые кисти в уведомлении об изменении DependencyProperty.

Надеюсь, это поможет.

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