Использование триггера для изменения свойства многих предметов - PullRequest
0 голосов
/ 29 июля 2011

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

Теперь я хочу изменить элемент управления, чтобы он имел свойство «Активно». Если это правда, он должен использовать свойство ActiveBrush для мазка некоторых прямоугольников в шаблоне, иначе он должен использовать 'InactiveBrush'.

Я хочу использовать ActiveBrush в качестве обводки по умолчанию и изменить его на InactiveBrush. с триггером.

Это прекрасно работает с одним прямоугольником, когда я использую это:

<Trigger Property="Active" Value="False">
  <Setter TargetName="Rec1" Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
</Trigger>

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

Я уже пробовал:

<Trigger Property="Active" Value="False">
  <Setter Property="Rectangle.Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
</Trigger>

Но это не сработало.

У кого-нибудь есть предложения, как это реализовать?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 июля 2011

@ Robert Rossney - этот стиль не будет работать, так как целевой тип Rectangle не имеет свойства Active.Но это правильный путь, с небольшим изменением:

<Style TargetType="Rectangle">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Active, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}" Value="False">
            <Setter Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Этот стиль должен быть вложен в Style.Resources стиля элемента управления или в ControlTemplate.Resources ControlTemplate для элемента управления.Таким образом, вы локализуете этот стиль только для вашего контроля.Любой прямоугольник вне вашего контроля не будет затронут.

1 голос
/ 29 июля 2011

Я уверен, что вы это знаете, но просто упускаете это из виду: если вы хотите применить стиль ко всем элементам управления типа, создайте стиль с TargetType этого типа и поместите его в словарь ресурсов вашего пользовательского элемента управления , Если вам все еще необходимо применить определенные стили к отдельным элементам управления этого типа, определите эти стили с помощью свойства BasedOn.

Итак, в вашем MyControl.Resources элементе вы бы поместили:

<Style TargetType="Rectangle">
   <Style.Triggers>
      <Trigger Property="Active" Value="False">
         <Setter Property="Stroke" Value="{Binding Path=InactiveBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
      </Trigger>
   <Style>
<Style>

и любой Rectangle, которому нужен собственный стиль, будет начинаться так:

<Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}">
...