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

Код: 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
WPF: Триггер по отношению к другому элементу.
    #39021051
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WPF: Триггер по отношению к другому элементу.
    #39021061
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WPF: Триггер по отношению к другому элементу.
    #39021140
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WPF: Триггер по отношению к другому элементу.
    #39021311
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Триггер по отношению к другому элементу.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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