RadioButton и установка Style для parent`а

WPF
  1. 6 года назад

    Не могу сообразить, как без применения программного кода, чисто средствами XAML с использованием триггеров назначить родителю StackPanel стиль по событию IsChecked=True на RadioButton.
    Имею несколько RadioButton обернутых StackPanel. Если RadioButton IsChecked=True необходимо установить Background="Red" у StackPanel только у данной кнопки. Подскажите, что можно сделать?

  2. Почему-то

    <Style x:Key="Control">
                <Style.Triggers>
                    <Trigger Property="RadioButton.IsChecked" Value="True">
                        <Setter Property="StackPanel.Background" Value="Red"/>
                    </Trigger>
                </Style.Triggers>
            </Style>

    устанавливает BackGround="Red" для RadioButton, а не для StackPanel

  3. Добавлено 6 года назад RusNekromant

    Может вместо (на правах бреда чисто интуитивно)

    <Setter Property="StackPanel.Background" Value="Red"></Setter>

    что то типа

    <Setter Property="Parent.Background" Value="Red"></Setter>

    Хотя врятли распространение проперти может идти вверх по дереву

    А если создать тригер StackPanel? Что бы он проверял только определенный RadioButton или связать какой нибудь параметр с RadioButton и прописать тригер что при параметре равном столько то сменить цвет. Другими словами зайти с обратной стороны

  4. <Setter Property="Parent.Background" Value="Red"></Setter> - Parent тут не работает

    Триггер для StackPanel делал, но ему невозможно установить Property="IsChecked", увы. Да и на RadioButton он не реагирует.

  5. Найти это сообщение rz3rr
    Триггер для StackPanel делал, но ему невозможно установить Property="IsChecked", увы.

    Делай тригером смену цвета у RadioButton и подвязывай значение цвета к StackPanel. Неужели нельзя? Или менять цвет у RadioButton нельзя по соображениям UI менять?

  6. Как вариант, да. Но требуется у каждого RadioButton`а объявлять собственное Name для реализации
    <Binding ElementName="RadioButton.." Path="BackGround"/>

  7. А если как то так? http://professorweb.ru/my/WPF/base_WPF/level4/4_6.php

  8. Сделал привязку через конвертер. Совсем без программного кода не получилось. Не хотелось создавать "лишний" класс. :)

  9. А ну да я забыл что ты хотел только средствами XAML сорь :) Ну получается все таки можно сделать, только много писать придется.

  10. Ещё одна проблема с теми же эленетами..... При использовании MultiBinding

    <Window x:Class="Multibinding.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:Multibinding"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:RbConverters x:Key="RbConverter" />
            <Style TargetType="Border" x:Key="rb1" >
                <Setter Property="Background">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource RbConverter}">
                            <Binding Path="IsChecked" ElementName="RadioButton1"/>
                            <Binding Path="IsMouseOver" ElementName="RadioButton1"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
            <Style TargetType="Border" x:Key="rb2" >
                <Setter Property="Background">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource RbConverter}">
                            <Binding Path="IsChecked" ElementName="RadioButton2"/>
                            <Binding Path="IsMouseOver" ElementName="RadioButton2"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
    
         <StackPanel>
            <Border Style="{StaticResource rb1}">
               <RadioButton Content="RadioButton1" GroupName="numgrp1" Name="RadioButton1" />
            </Border>
            <Border Style="{StaticResource rb2}">
                <RadioButton Content="RadioButton2" GroupName="numgrp1" Name="RadioButton2"/>
            </Border>
        </StackPanel>
    
    </Window>
    
    
    namespace Multibinding
    {
        class RbConverters : IMultiValueConverter
        {
            SolidColorBrush _brush = new SolidColorBrush();
            public object Convert(object[] values, Type targetType,object parameter, CultureInfo culture)
            {
    
                bool bln1 = values != null && (bool)values[0];
                bool bln2 = values != null && (bool)values[1];
                if (bln1)
                {
                    _brush.Color=Color.FromRgb(System.Convert.ToByte(255), System.Convert.ToByte(0),System.Convert.ToByte(0));
                }
                else if (bln2)
                {
                    _brush.Color = Color.FromRgb(System.Convert.ToByte(0), System.Convert.ToByte(255),System.Convert.ToByte(0));
                }
                else
                {
                    _brush.Color = Color.FromRgb(System.Convert.ToByte(0), System.Convert.ToByte(0), System.Convert.ToByte(255));
                }
                return _brush;
            }
    
            public object[] ConvertBack(object value, Type[] tTypes,object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
        }
    }
    

    "Подсветка" меняется на обоих Border одновременно. Что может быть не так?

  11. Сорь... Нашел... В конверторе SolidColorBrush _brush = new SolidColorBrush(); "во вне" торчал...

или зарегистрируйтесь чтобы ответить