WPF / XAML: доступ к элементу вне ControlTemplate из ControlTemplate.Trigger - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть приложение WPF, в котором есть индикатор и переключатель. Когда я нажимаю переключатель, переключатель и свет должны измениться на изображение «ВКЛ», а когда я нажимаю снова, они должны изменить свое изображение «ВЫКЛ». У меня есть одно ограничение: я могу делать это только в XAML и, следовательно, без файлов с выделенным кодом. Я могу переопределить шаблон элемента управления для ToggleButton. В этом шаблоне управления есть только переключатель освещения (сам свет не должен быть активным), и это, очевидно, моя проблема. Я не могу получить доступ к переключателю освещения из-за триггеров шаблонов управления. Я получаю следующую ошибку «Не удается найти цель триггера 'lightImage'. (Цель должна появиться перед любыми сеттерами, триггерами или условиями, которые ее используют.)"

Вот мой код:

 <Image Name="lightImage" Source="Resources/LOFF.bmp" Stretch="None" Canvas.Left="82" Canvas.Top="12"/>
  <ToggleButton Canvas.Left="169" Canvas.Top="123">
    <ToggleButton.Template>
      <ControlTemplate TargetType="ToggleButton">
        <Image Name="switchImage" Source="Resources/SUp.bmp"/>
        <ControlTemplate.Triggers>
          <Trigger Property="IsChecked" Value="True">
            <Setter TargetName="switchImage" Property="Source" Value="Resources/SDown.bmp" />
            <Setter TargetName="lightImage" Property="Source" Value="Resources/LON.bmp"/>
          </Trigger>
          <Trigger Property="IsChecked" Value="False">
            <Setter TargetName="switchImage" Property="Source" Value="Resources/SUp.bmp"/>
            <Setter TargetName="lightImage" Property="Source" Value="Resources/LOFF.bmp"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </ToggleButton.Template>
  </ToggleButton>

Есть ли другой способ сделать это? Приветствия

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Наконец-то я исправил это. Я не считал, что вы можете использовать свойство IsHitTestVisible для изображения, которое я не хочу, чтобы на него нажимали. С этим свойством я мог просто поместить lightImage в шаблон управления и вуаля.

Вот код:

<ToggleButton Canvas.Left="81" Canvas.Top="20">
            <ToggleButton.Template>
                <ControlTemplate TargetType="ToggleButton">
                    <Canvas>
                        <Image x:Name="lightImage"  Source="Resources/LOFF.bmp" IsHitTestVisible="False" />
                        <Image x:Name="switchImage" Source="Resources/SUp.bmp" Canvas.Left="88" Canvas.Top="100"/>
                    </Canvas>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="lightImage" Property="Source" Value="Resources/LON.bmp"/>
                            <Setter TargetName="switchImage" Property="Source" Value="Resources/SDown.bmp"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="False">
                            <Setter TargetName="lightImage" Property="Source" Value="Resources/LOFF.bmp"/>
                            <Setter TargetName="switchImage" Property="Source" Value="Resources/SUp.bmp"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </ToggleButton.Template>
        </ToggleButton>
0 голосов
/ 22 ноября 2010

У вас, похоже, есть "onImage", но вы пытаетесь сослаться на "lightImage"?

Редактировать: так как эти триггеры находятся внутри вашего элемента управления, я думаю, что он ищет «lightImage» только внутри этого шаблона. Вы должны создать свойство для «source» в коде и связать его как с вашим изображением, так и с кнопкой.

Edit2: если нет кода позади, может быть, вы могли бы попробовать некоторую относительную привязку вдоль строк:

{Binding RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type Canvas}},
Path=lightImage.Source}

Извините, если это совершенно глупо, я использую Silverlight, и это доступно только в WPF, так что только дикая догадка!

В любом случае, идея приходит из этой таблицы, кажется, у вас могут быть довольно сложные привязки в WPF, поэтому стоит попробовать несколько разных: http://www.nbdtech.com/Free/WpfBinding.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...