Променен е SolidColorBrush в стил TextBox

Вече се опитах да попитам, но вероятно не съм дал достатъчно информация. Опитвам се да създам своя собствена WPF тема. Всичко беше наред, докато не създадох този стил.

    <Style TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="PART_ContentHost">
                                        <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                        <EasingColorKeyFrame KeyTime="0" Value="Red"/>
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Background">
                                        <EasingColorKeyFrame KeyTime="0" Value="Yellow"/>
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="ReadOnly"/>
                            <VisualState x:Name="MouseOver"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Rectangle x:Name="Background" Fill="{StaticResource OniiControlBackgroundBrush}" Stroke="{StaticResource OniiNormalBrush}" RadiusX="2" RadiusY="2"/>
                    <ScrollViewer x:Name="PART_ContentHost" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" FontFamily="{TemplateBinding FontFamily}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Black"/>
    <Setter Property="SnapsToDevicePixels" Value="True"/>
</Style>

Трябва да промени цвета на фона на TextBox и BorderBrush, когато TextBox е деактивиран.

Цветовете са дефинирани в същия ResourceDictionary

<Color x:Key="MainColor">#FF595959</Color>
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color>

<SolidColorBrush x:Key="OniiNormalBrush" Color="{StaticResource MainColor}"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{StaticResource OniiControlBackgroundColor}" />

И какъв всъщност ми е проблемът, не знам. Какво знам:

1/ „Когато TextBox е деактивиран, той променя цвета на всичко, което използва OniiControlBackgroundBrush, в червен цвят“

  • OniiControlBackgroundBrush се споменава в други стилове като StaticResource

2/ „Когато превключа тези цветове, само OniiControlBackgroundBrush се променя, но този път на жълто“

<Rectangle x:Name="Background" Fill="{StaticResource OniiNormalBrush}" Stroke="{StaticResource OniiControlBackgroundBrush}" RadiusX="2" RadiusY="2"/>
  • OniiNormalBrush също се споменава в други стилове като StaticResource

3/ „Всичко е дефинирано в един речник на ресурсите“

    <Application.Resources>
    <ResourceDictionary Source="Theme/OniiResourceDictionary.xaml">
    </ResourceDictionary>
</Application.Resources>

4/ „Опитах се да възпроизведа този проблем в по-малко решение с по-малко персонализирани стилове и не успях“

  • Използвах същия стил TextBox.

    <TextBox Height="32" HorizontalAlignment="Left" Margin="38,51,0,0" Name="textBox1" VerticalAlignment="Top" Width="215" />
    <CheckBox Content="Enabled" Height="16" HorizontalAlignment="Left" Margin="259,51,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_Unchecked" />
    <Border Height="148" HorizontalAlignment="Left" Margin="254,126,0,0" Name="border1" VerticalAlignment="Top" Width="98" />
    <Rectangle Fill="{StaticResource OniiNormalBrush}" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Height="148" HorizontalAlignment="Left" Margin="358,126,0,0" Name="rectangle5" VerticalAlignment="Top" Width="99" />
    
  • Текстовото поле е деактивирано и активирано от квадратчето за отметка, рамката използва персонализиран стил с двата цвята като статични ресурси

5/ „Когато добавя следния код към първоначалното си решение проблемът изчезва“

<Rectangle Height="71" HorizontalAlignment="Left" Margin="130,131,0,0" Name="rectangle2" StrokeThickness="20" Stroke="{StaticResource OniiControlBackgroundBrush}" Fill="{StaticResource OniiNormalBrush}" VerticalAlignment="Top" Width="98" />

Наистина ли пропускам нещо? Или просто съм наистина глупава? Във всеки случай вашата помощ ще бъде оценена. Наистина съм изгубен. Е, и последното нещо, което не искам да използвам x:Shared="false" главно защото виждам, че няма проблем с промяната на OniiNormalBrush. Благодаря ти.


person Kapitán Mlíko    schedule 12.11.2012    source източник


Отговори (1)


Проблемът изглежда се крие във вашите обвързвания на ресурси. Когато използвате StaticResource, това означава, че ресурсът се зарежда, когато прозорецът се инициализира и след това никога повече не се зарежда. По този начин в повечето случаи, когато модифицирате ресурса, контролите, които са обвързани с него, не знаят за промяната.

В #4 не сте изпитали проблема, защото сте използвали DynamicResource, който позволява ресурсът да се актуализира по време на изпълнение.

Редактиране: При разглеждане на нещата втори път изглежда, че може да е едно от двете неща.

Първо.. статичното свързване на цвета не позволява актуализиране. Решава ли проблема промяната от статичен към динамичен при обвързване на вашия цвят с вашата четка?

<Color x:Key="MainColor">#FF595959</Color>
<Color x:Key="OniiControlBackgroundColor">#FF333333</Color>

<SolidColorBrush x:Key="OniiNormalBrush" Color="{DynamicResource MainColor}"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="{DynamicResource OniiControlBackgroundColor}" />

Второ... Анимацията задава цвета на четката... което по същество изчиства обвързването, като й се присвоява директен цвят. Бих предположил, че когато анимацията приключи, цветът ще бъде върнат към обвързването, но това може да не е така. Това има ли ефект:

<SolidColorBrush x:Key="OniiNormalBrush" Color="#FF595959"/>
<SolidColorBrush x:Key="OniiControlBackgroundBrush" Color="#FF333333" />
person Bill Tarbell    schedule 12.11.2012
comment
Няма проблем с промяната на цвета на текстовото поле... цветът на четката OniiControlBackgroundBrush се променя навсякъде. не искам това В #4, когато споменавам Brush като StaticResource, изглежда също няма проблем. - person Kapitán Mlíko; 12.11.2012
comment
Добре, но в горните примери вие статично свързвате цвета на четката. Цвят={StaticResource MainColor}. Предполагам, че във вашите по-ниски примери не правите това. Ресурсите ви дават препратка към обекта. В случай на цветове, ако поставите нов цвят, тогава референцията се променя и всичко, което е реферирано статично, няма да получи актуализацията, но референциите на dynamicResource ще видят новия цвят. Освен това стойността по подразбиране за x:Shared е true, така че ръчното й задаване на true няма допълнителен ефект. - person Bill Tarbell; 12.11.2012
comment
Да, това е проблемът. имам и двете четки, споменати навсякъде като StaticResource. Така че не очаквам да се променят. Най-лошият проблем е, че една от тези четки се актуализира там, където трябва, а втората се актуализира НАВСЯКЪДЕ, КЪДЕТО се използва. Съжалявам за това x:Shared=true, което се обърка. Това, което споменах, беше x:Shared=false И също редактирах #4, където този път използвах StaticResource. Все същият резултат. Единият цвят се актуализира навсякъде, а вторият само там, където трябва. - person Kapitán Mlíko; 13.11.2012