powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
8 сообщений из 8, страница 1 из 1
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126105
WildRay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, у меня такая проблема: условно говоря, у меня есть Border (B1), Background которого привязан с помошью Binding к свойству Background другого Border`a (B2), который оформлен в виде статического поля. Свойство привязки Mode=OneWay, следовательно меняя Background исходного Border`a (B1), значение источника привязки (B2.Background) меняться не должно. При явном изменении B1.Background.Color в коде так все и происходит, однако если анимировать это свойство с помошью ColorAnimation начинает меняться и свойство B2.Background.Color, в результате чего происходит нежелательное изменение цвета и других элементов, привязанных к этому же источнику B2. Подскажите пожалуйста, как выйти из этой ситуации, чтобы при анимации менялся только B1.Background.Color, не трогая значение свойства источника, к которому он прявязан.

<Window x:Class="WpfApplication1.MainWindow"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Border Height="50" Name="Brd" Background="{Binding Source={x:Static local:MainWindow.B}, Path=Background}">
<Border.Triggers>
<EventTrigger RoutedEvent="MouseLeftButtonUp">
<BeginStoryboard>
<Storyboard>
<ColorAnimation To="Yellow" Duration="0:0:2" Storyboard.TargetProperty="Background.Color"></ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
</Border>
<Button Click="Button_Click">Показать значение цвета источника</Button>
</StackPanel>
</Window>



namespace WpfApplication1
{
public partial class MainWindow : Window
{
public static Border B = new Border { Background = new SolidColorBrush(Colors.Red) };

public MainWindow()
{
InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((B.Background as SolidColorBrush).Color.ToString());
}

}
}

Я думал перед началом анимации в коде явно задавать значение анимируемого свойства, а после окончания анимации снова очищать это значение через DependencyObject.ClearValue() и воззданавливать установку значения на основе привязки, однако такой подход вовсе не рационален, наверняка есть решение проще. Заранее спасибо, решение, демонстрирующее данную проблемы прилагаю ниже.
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126284
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое произошло, по той причине, что у вас оба Border'a через свойство Background ссылаются на один и тот же обьект SolidBrush, который вы создаете code behind.

У этого обьекта есть Dependency Property: SolidBrush.ColorProperty Вы его и анимируете, в связи с этим, оба инстанса Border, ссылающихся на этот SolidBrush, реагируют на это.

Если бы вы прибиндили только ColorProperty, все было бы как вы того хотите. Вот пример исправленный.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Border Height="50" Name="Brd">
            <Border.Background>
                <SolidColorBrush Color="{Binding Source={x:Static local:MainWindow.B}, Path=Background.Color}"></SolidColorBrush>
            </Border.Background>
            <Border.Triggers>
                <EventTrigger RoutedEvent="MouseLeftButtonUp">
                    <BeginStoryboard >
                        <Storyboard>
                            <ColorAnimation To="Yellow" Duration="0:0:2" Storyboard.TargetProperty="Background.Color"></ColorAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Border.Triggers>
        </Border>
        <Button Click="Button_Click">Показать значение цвета источника</Button>
    </StackPanel>
</Window>
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126336
WildRay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord BritishТакое произошло, по той причине, что у вас оба Border'a через свойство Background ссылаются на один и тот же обьект SolidBrush, который вы создаете code behind.

У этого обьекта есть Dependency Property: SolidBrush.ColorProperty Вы его и анимируете, в связи с этим, оба инстанса Border, ссылающихся на этот SolidBrush, реагируют на это.

Если бы вы прибиндили только ColorProperty, все было бы как вы того хотите. Вот пример исправленный.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Border Height="50" Name="Brd">
            <Border.Background>
                <SolidColorBrush Color="{Binding Source={x:Static local:MainWindow.B}, Path=Background.Color}"></SolidColorBrush>
            </Border.Background>
            <Border.Triggers>
                <EventTrigger RoutedEvent="MouseLeftButtonUp">
                    <BeginStoryboard >
                        <Storyboard>
                            <ColorAnimation To="Yellow" Duration="0:0:2" Storyboard.TargetProperty="Background.Color"></ColorAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Border.Triggers>
        </Border>
        <Button Click="Button_Click">Показать значение цвета источника</Button>
    </StackPanel>
</Window>



Да, вы совершенно правы, спасибо! Но ведь если после анимации в коде поменять значение B2.Background.Color, Binding уже не срабатывает
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126345
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildRay
Да, вы совершенно правы, спасибо! Но ведь если после анимации в коде поменять значение B2.Background.Color, Binding уже не срабатывает

автор<ColorAnimation To="Yellow" Duration="0:0:2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" ></ColorAnimation>
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126358
WildRay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord BritishWildRayДа, вы совершенно правы, спасибо! Но ведь если после анимации в коде поменять значение B2.Background.Color, Binding уже не срабатывает

автор<ColorAnimation To="Yellow" Duration="0:0:2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" ></ColorAnimation>


Да, но мне ведь нужно, например, на наведение мышью проанимировать до какого-то цвета и задержать его, а не сбрасывать и только после ухода мыши проанимировать обратно
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126368
WildRay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура! Все все все, я придумал, нужно просто на первой аниамции FillBehavior не указывать, а при уводе мыши поставить на анимации FillBehavior="Stop"! Спасибо вам большущее! Без вас бы не справился! :*
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126416
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildRay,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border Background="Black">
            <Border.Triggers>
                <EventTrigger RoutedEvent="MouseMove">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation To="Yellow" Duration="0:0:1" Storyboard.TargetProperty="Background.Color"></ColorAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="MouseLeave">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation To="Black" Duration="0:0:1" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" ></ColorAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Border.Triggers>
        </Border>
    </Grid>
</Window>



Можно и через VSM, правда не знаю Border знает об VSM.
...
Рейтинг: 0 / 0
ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
    #38126417
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildRayУра! Все все все, я придумал, нужно просто на первой аниамции FillBehavior не указывать, а при уводе мыши поставить на анимации FillBehavior="Stop"! Спасибо вам большущее! Без вас бы не справился! :*

OK, у меня окно открытое осталось. Не обновил, думал что еще не решено.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ColorAnimation меняет сам источник {Binding ... Mode=OneWay}, а не целевое свойство
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]