首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ControlTemplate.Trigger访问ControlTemplate外部的元素

从ControlTemplate.Trigger访问ControlTemplate外部的元素
EN

Stack Overflow用户
提问于 2010-11-22 23:44:25
回答 2查看 2.4K关注 0票数 0

我有一个WPF应用程序,有一个灯和一个开关。当我按下开关时,开关和灯应该变成“开”的图像,当我再按一次时,它们应该变成“关”的图像。我有一个限制:我只能在XAML中严格执行此操作,因此没有代码隐藏文件。我这样做的方法是重新定义ToggleButton的控件模板。只有灯开关在这个控件模板中(灯本身不应该是可点击的),这显然是我的问题。我不能从控制模板触发器内部访问电灯开关。我收到以下错误:“无法找到触发器目标'lightImage‘。(该目标必须出现在任何Setter、触发器或使用它的条件之前。)”

下面是我的代码:

代码语言:javascript
复制
 <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>

有没有其他方法可以做到这一点?干杯

EN

回答 2

Stack Overflow用户

发布于 2010-11-22 23:48:15

您似乎有"onImage",但尝试引用"lightImage"?

编辑:由于这些触发器在你的控制模板中,我认为它只在该模板中查找"lightImage“。您应该在后台代码中为“source”创建一个属性,并在图像和按钮中绑定到该属性。

Edit2:如果后面没有代码,也许你可以尝试一些相对绑定,比如:

代码语言:javascript
复制
{Binding RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type Canvas}},
Path=lightImage.Source}

抱歉,如果这是完全愚蠢的,我使用Silverlight,这只在WPF中可用,所以只是一个大胆的猜测!

无论如何,这个想法来自于这个小抄,似乎你可以在WPF中有相当复杂的绑定,所以值得尝试几个不同的:http://www.nbdtech.com/Free/WpfBinding.pdf

票数 0
EN

Stack Overflow用户

发布于 2010-11-23 03:06:48

最后,我修复了它。我没想到你可以在我不想被点击的图片上使用"IsHitTestVisible“属性。有了这个属性,我只需将lightImage放在控件模板中,就可以了。

代码如下:

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4247211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档