2013-04-04 2 views
0

У меня возникла проблема с программным изменением цвета Toggle в TreeView. я определил в ResourceDictionary SolidColorBrush с:
Изменение цвета переключателя (TreeView) в wpf программно

<SolidColorBrush x:Key="FillBrush" Color="#000000" /> 

я создал стиль для ToggleButton в ResourceDictionary, а также:

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton"> 
     <Setter Property="Focusable" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ToggleButton"> 
        <Grid Width="auto" Height="auto" Background="Transparent" ShowGridLines="True">       
         <Path Fill="{StaticResource FillBrush}" x:Name="ExpandPath" HorizontalAlignment="Center" VerticalAlignment="Center" 
             Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z"> 
         </Path> 
        </Grid> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter Property="Data" TargetName="ExpandPath" Value="M 0 0 L 0 8 L 2 0 z M 2 8 L 2 0 L 0 8 z"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

В коде я пытаюсь программно изменить значение ключа FillBrush:

SolidColorBrush cc = (SolidColorBrush)Resources["FillBrush"]; 
cc.Color=c.Color; 

но когда я меняю его, Togg Кнопка le не меняется.

Любые подсказки по изменению цвета существующего компонента? Я немного смущен шаблонами компонентов через ResourceDictionary, поэтому я думаю, что там что-то не так. Спасибо за помощь

EDIT: в коде я использую StaticResource. Я также попробовал его с DynamicResource, но ничего не произошло, и значение цвета не изменилось.

EDIT 2: если я проверить значение в ресурс FillBrush с:

MessageBox.Show(((SolidColorBrush)Resources["FillBrush"]).Color.ToString()); 

значение заменяется новым значением. Так оно и работает. В этом случае должно быть что-то не так, если использовать его в стиле ToggleButton.

+0

Ваша проблема кажется очень похожей по своему характеру той, что предлагается здесь: http://stackoverflow.com/questions/15819796/change-wpf-button-background-image-programatically/15819880#15819880 Ответы и обсуждение могут быть полезно для вас. – Clint

+0

thx для подсказки я проверю это. – piggy

+0

Вы можете найти 'ControlTemplate' по умолчанию для' ToggleButton' на [этой веб-странице] (http://msdn.microsoft.com/en-us/library/cc296245 (v = vs.95) .aspx). Альтернативно, если это не помогает, возможно, вы могли бы достичь того, что хотите использовать привязки или обработчики событий? Попробуйте взглянуть на него с другого направления. Какова ваша общая цель? – Sheridan

ответ

0

A StaticResource будет читать только начальный цвет. Чтобы динамически обновлять цвет, вам необходимо объявить свой Brush как DynamicResource.

<Path Fill="{DynamicResource FillBrush}" x:Name="ExpandPath" HorizontalAlignment="Center" 
    VerticalAlignment="Center" Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z"> 

В примере есть this post.

+0

Я попробовал его с dynamicResource, но ничего не изменилось .. Это было точно так же, как и для StaticResource :(. Но спасибо за подсказку – piggy

+0

Check сообщение, которое я добавил в мой ответ. – Sheridan

+0

«этот пост» связывает эту страницу ^^ – piggy

0

Попробуйте заменить Brush - не изменяя его Color, например ...

this.Resources["FillBrush"] = new SolidColorBrush(Colors.Red); 

т.е. Brush вероятно Freezed. Проверьте, например. эта ссылка (только первый) Style Setter Freezing Brush

Если вы следующие ...

if(!brush.IsFrozen) // 'not froze' i.e. free to change 
    brush.Color = Colors.Red; 

... скорее всего, вы никогда не будете вводить. Вы также получаете исключение при доступе к замороженному объекту.

Или еще лучше, вы должны сделать ...

var brush = (SolidColorBrush)this.Resources["FillBrush"]; 
if (brush.IsFrozen) 
{ 
    SolidColorBrush clone = brush.Clone(); 
    clone.Color = Colors.Red; 
    this.Resources["FillBrush"] = clone; 
} 
else 
    brush.Color = Colors.Red; 

Для получения более подробной информации проверить эту самую первую ссылку MS на эту тему, которая включает в себя именно эти вопросы ...

Freezable Objects Overview

+0

thx, но не работает для меня:/.. – piggy

+0

он делает по вашему стилю - я понятия не имею, что еще у вас может быть там – NSGaga

+0

, конечно, используйте 'DynamicResource' как вы уже знаете – NSGaga

0

С Blend, я мог бы сделать это менее чем за 5 щелчков мыши,

(Чтобы просмотреть изображение в полном размере, щелкните правой кнопкой мыши и выберите View Image или Открыть изображение в новой вкладке, в зависимости от веба-браузер, который вы используете)

enter image description here

Я не вставив сгенерированный XAML, потому что есть много, только та часть, которая бленда высветила.

enter image description here

+0

из этой второй картинки, похоже, что вы изменили значение borderBrush. Но я не могу изменить цвет заливки пути.:/.. border c olor (background of border) отлично работает для меня .. – piggy

+0

Нет, на самом деле это свойство Background, изображение обрезано. (извините, я не обращал внимания) – Aybe

0

Иногда, если деталь вы хотите изменить «похоронен» в стиле это, кажется, не узнают, когда вы пытаетесь изменить его, по крайней мере, это то, что я испытал, прежде чем при попытке для стилей элементов, а затем для того, чтобы динамически изменять цвет или семейство шрифтов. Попробуйте это:

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton"> 
    <Setter Property="Focusable" Value="False"/> 
    <Setter Property="Foreground" Value="{StaticResource FillBrush}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="ToggleButton"> 
      <Grid Width="Auto" Height="Auto" Background="Transparent" ShowGridLines="True"> 
       <Path Fill="{Binding Foreground}" x:Name="ExpandPath" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z"/> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

и когда вы хотите изменить цвет ToggleButton - вместо того, чтобы изменить цвет FillBrush = изменить значение переднего плана фактического ToggleButton. Поскольку Fill of the Path привязан к цвету переднего плана, это должно вызвать его изменение.

Надеюсь, что это будет полезно и работает для вас. Я признаю, что я не тестировал этот фрагмент кода XAML, но мне приходилось выполнять подобные работы в предыдущих проектах.

Смежные вопросы