使用控制样式,如何根据toggleButton.ischecked绑定或触发更改对工具提示内容的更改?
我定义了一个共享的 ToggleButton
样式,当 IsChecked
为 true
时显示一张图像,当 IsChecked
时显示不同的图像是假
。将 IsChecked
绑定到 ViewModel 上的布尔属性可以很好地显示所需的图像,因此我知道我的样式正在应用,并且 DataTrigger
绑定到 IsChecked< /代码> 有效。
我想在 IsChecked
更改时更改 ToolTip
文本,但我在实现该操作时遇到了相当多的麻烦。理想情况下,我希望 ToolTip
在未选中时显示“打开”,在选中时显示“关闭”之类的内容。
问题是 ToolTip
未连接到可视化树中的 ToggleButton
,因此我需要另一种方法来查找 ToggleButton.IsChecked
。我试图完全以一种风格来完成此操作,因为我有很多这样的按钮分散在各处,因此不允许对虚拟机进行任何更改。
理想情况下,该解决方案允许我使用 ToggleButton.Tag
来存储文本,并应用 Converter
和 StringFormat
(或 ContentStringFormat )。我已经覆盖了
ContentTemplate
并将其替换为准系统 ContentPresenter
以摆脱典型的 ToggleButton
效果,因此可以进一步更改它如果需要的话。 (也许我已经删除了一些重要的内容?idk。)
这是我的样式,可以更改图像,但 ToolTip
永远不会改变。
<!--Toggle button where content is a switch image that's "On" when checked and "Off" when anything else-->
<Style TargetType="ToggleButton" x:Key="OnOffToggleButton" x:Shared="False">
<!-- this worked to format the initial tooltip contents, but no way to bind.
<Style.Resources>
<Style TargetType="ToolTip">
<Setter Property="ContentStringFormat" Value="Turn on {0}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ???}" Value="True">
<Setter Property="ContentStringFormat" Value="Turn off {0}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Style.Resources> -->
<Setter Property="Content" Value="{StaticResource ToggleOffImage}"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<ContentPresenter>
<ContentPresenter.ToolTip>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<!-- this works -->
<Setter Property="Text" Value="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn on {0}}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked}" Value="True">
<!-- trigger has no effect -->
<Setter Property="Text" Value="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn off {0}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</ContentPresenter.ToolTip>
</ContentPresenter>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Content" Value="{StaticResource ToggleOnImage}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="ToolTip">
<Setter.Value>
<!-- another thing that does not work -->
<TextBlock Text="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn off {0}}" />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
按钮本身的定义类似于:
<ToggleButton Style="{StaticResource OnOffToggleButton}"
IsChecked="{Binding IsPoweredOn, Mode=OneWay}"
Command="{Binding TogglePowerCommand}"
Tag="Device Power"/>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
StringFormat
不能与ToolTip
一起使用,因为它可以包含object
类型的任意内容,而不仅仅是纯文本。但是,ToolTip
公开了一个属性ContentStringFormat
。由于
ToolTip
托管在单独的弹出窗口中,因此它与ToggleButton
不是同一可视化树的一部分,但您可以使用 ToolTip 的 noreferrer">PlacementTarget
。转换器仍然可以像往常一样应用于
Content
绑定中。The
StringFormat
does not work with aToolTip
, as it can contain arbitrary content of typeobject
, not just plain text. However, theToolTip
exposes a propertyContentStringFormat
that you can use.Since a
ToolTip
is hosted in a separate popup window, it is not part of the same visual tree as theToggleButton
, but you can refer to it using thePlacementTarget
of theToolTip
.A converter can still be applies in the
Content
binding as usual.