Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Триггер по отношению к другому элементу. / 5 сообщений из 5, страница 1 из 1
01.08.2015, 17:47
    #39021012
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF: Триггер по отношению к другому элементу.
Хочу менять свойство одного элемента в зависимости от свойства другого и как-то не понял, как это правильно сделать. В итоге после битья головой об компилятор, учебник и гугл смог сделать так:

Код: 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.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
  <StackPanel>

    <ToggleButton x:Name="blabla1">
      blabla1
    </ToggleButton>

    <ToggleButton x:Name="blabla2">
      <ToggleButton.Style>
        <Style>
          <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=blabla1, Path=IsChecked}" Value="true">
              <Setter Property="ToggleButton.Background" Value="Red" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </ToggleButton.Style>
      blabla2
    </ToggleButton>

  </StackPanel>
</Window>



Этот прием, в принципе, решает мой вопрос, но что смущает:
Сеттер работает только по отношению к "своему" элементу. TargetName не разрешается применять не в контексте шаблона (а шаблон в моем случае не нужен), можно как-то указать установку свойства "чужого" элемента (например, если я хочу в моем примере разместить триггер в верхнем ToggleButton-е или вообще, в ресурсе окна)?

Использован DataTrigger, действительно обычный триггер применить не удастся?
...
Рейтинг: 0 / 0
01.08.2015, 21:33
    #39021051
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF: Триггер по отношению к другому элементу.
Shocker.Pro,

я давно уже забил делать какую то логику в ContentControl'ах, это контрпродуктивно, и только добавляет проблем
Использую либо DateTemplate с ContentPresenter'ом, либо ControlTemplate где нужно

вот пример:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<Window x:Class="WpfApplication11.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">
    <Window.Resources>
        <ControlTemplate x:Key="ToggleButtonTemplate" TargetType="{x:Type ToggleButton}">
            <Border Margin="{TemplateBinding Margin}" 
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    CornerRadius="3"
                    Padding="{TemplateBinding Padding}">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
        </ControlTemplate>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="{Binding Name,RelativeSource={RelativeSource Self}}"/>
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Template" Value="{StaticResource ToggleButtonTemplate}"/>
        </Style>
        <ControlTemplate x:Key="ControlTemplate"  TargetType="{x:Type Control}">
            <UniformGrid Rows="2">
                <ToggleButton x:Name="ToggleButton1"/>
                <ToggleButton x:Name="ToggleButton2"/>
            </UniformGrid>
            <ControlTemplate.Triggers>
                <Trigger SourceName="ToggleButton1" Property="IsChecked" Value="True">
                    <Setter TargetName="ToggleButton2" Property="Background" Value="Red"/>
                </Trigger>
                <Trigger SourceName="ToggleButton2" Property="IsChecked" Value="True">
                    <Setter TargetName="ToggleButton1" Property="Background" Value="Red"/>
                </Trigger>

            </ControlTemplate.Triggers>
            </ControlTemplate>
    </Window.Resources>
    <Control Template="{StaticResource ControlTemplate}" />
</Window>



в книге сказано (на сколько я помню), что Trigger'ы в ContentControl'е не были сделаны, но планировалось их добавить в будущем. Но мы давно уже в этом будущем, а WPF развивается как улитка.
Сделать так, как вы хотите, у вас не получится.
...
Рейтинг: 0 / 0
01.08.2015, 22:23
    #39021061
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF: Триггер по отношению к другому элементу.
Roman Mejtes,

Если упростить твой пример, то, фактически получается следующее:
Код: 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.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>

    <ControlTemplate x:Key="ControlTemplate"  TargetType="{x:Type Control}">
      <UniformGrid Rows="2">
        <ToggleButton x:Name="ToggleButton1">fff</ToggleButton>
        <ToggleButton x:Name="ToggleButton2">qqq</ToggleButton>
      </UniformGrid>
      <ControlTemplate.Triggers>
        <Trigger SourceName="ToggleButton1" Property="IsChecked" Value="True">
          <Setter TargetName="ToggleButton2" Property="Background" Value="Red"/>
        </Trigger>
        <Trigger SourceName="ToggleButton2" Property="IsChecked" Value="True">
          <Setter TargetName="ToggleButton1" Property="Background" Value="Red"/>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Window.Resources>
  <Control Template="{StaticResource ControlTemplate}" />
</Window>

то есть ты просто на ходу оборачиваешь всю конструкцию в контрол, чтобы обойти ограничение на использование SourceName и TargetName. То есть по идее, можно так обернуть все окно (содержимое) и юзать такие триггеры?

А для чего тогда ты дополнительно выносишь стиль и делаешь новый шаблон для ToggleButton?
...
Рейтинг: 0 / 0
02.08.2015, 12:40
    #39021140
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF: Триггер по отношению к другому элементу.
Shocker.ProRoman Mejtes,

Если упростить твой пример, то, фактически получается следующее:
Код: 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.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>

    <ControlTemplate x:Key="ControlTemplate"  TargetType="{x:Type Control}">
      <UniformGrid Rows="2">
        <ToggleButton x:Name="ToggleButton1">fff</ToggleButton>
        <ToggleButton x:Name="ToggleButton2">qqq</ToggleButton>
      </UniformGrid>
      <ControlTemplate.Triggers>
        <Trigger SourceName="ToggleButton1" Property="IsChecked" Value="True">
          <Setter TargetName="ToggleButton2" Property="Background" Value="Red"/>
        </Trigger>
        <Trigger SourceName="ToggleButton2" Property="IsChecked" Value="True">
          <Setter TargetName="ToggleButton1" Property="Background" Value="Red"/>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Window.Resources>
  <Control Template="{StaticResource ControlTemplate}" />
</Window>

то есть ты просто на ходу оборачиваешь всю конструкцию в контрол, чтобы обойти ограничение на использование SourceName и TargetName. То есть по идее, можно так обернуть все окно (содержимое) и юзать такие триггеры?

А для чего тогда ты дополнительно выносишь стиль и делаешь новый шаблон для ToggleButton?
У меня Windows 8,1 и ToggleButton имеет стиль, при наведении красный фон заменялся голубым, который перекрывал задний фон, по этому я на скорую руку заменил шаблон на шаблон "попроще" :)

ControlTemplate я использую, если мне нужно определить внеший вид конкретного Control'а или описать шаблон своих CustomControl'ов. А DataTemplate я использую для "связывания" ViewModel и View. + в DataTemplate я могу определить тип контекста, + сам по себе шаблон данные независимый элемент, который я могу легко перенести в любую другую точку программы и он так же поддерживает триггеры всех типов.
А для размещения шаблона данных просто кидаю ContentPresenter, задаю Content и ContentTemplate.
Как по мне, работать так в WPF намного удобнее.
...
Рейтинг: 0 / 0
02.08.2015, 22:10
    #39021311
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF: Триггер по отношению к другому элементу.
Ясно, спасибо
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Триггер по отношению к другому элементу. / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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