[英]How to use a trigger on ToggleButton.IsChecked or IsPressed correctly?
[英]Using a control style, how can you bind or trigger a change to ToolTip contents based on ToggleButton.IsChecked?
我定义了一个共享的ToggleButton
样式,当IsChecked
为true
时显示一个图像,而当IsChecked
为false
时显示另一个图像。 将IsChecked
绑定到 ViewModel 上的 boolean 属性可以很好地显示所需的图像,因此我知道正在应用我的样式并且绑定到IsChecked
的DataTrigger
可以正常工作。
我想在IsChecked
更改时更改ToolTip
文本,但我在让它工作时遇到了很多麻烦。 理想情况下,我希望ToolTip
在未选中时显示“打开”之类的内容,在选中时显示“关闭”之类的内容。
问题是ToolTip
没有连接到可视化树中的ToggleButton
,所以我需要另一种方法来找到ToggleButton.IsChecked
。 我正在尝试完全以一种风格来执行此操作,因为我周围散布着相当多的这些按钮,因此不允许对 VM 进行任何更改。
理想情况下,该解决方案将允许我使用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"/>
StringFormat
不适用于ToolTip
,因为它可以包含object
类型的任意内容,而不仅仅是纯文本。 但是, ToolTip
公开了一个您可以使用的属性ContentStringFormat
。
获取或设置一个复合
string
,该字符串指定在Content
属性显示为string
时如何设置其格式。
由于ToolTip
托管在单独的弹出窗口 window 中,因此它与ToggleButton
不属于同一可视化树,但您可以使用ToolTip
的PlacementTarget
引用它。
获取或设置
ToolTip
打开时相对于其定位的UIElement
。
<Style TargetType="ToggleButton" x:Key="OnOffToggleButton" x:Shared="False">
<Setter Property="Content" Value="{StaticResource ToggleOffImage}"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
ContentStringFormat="Turn on {0}">
</ToolTip>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<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>
<ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
ContentStringFormat="Turn off {0}">
</ToolTip>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
转换器仍然可以像往常一样应用于Content
绑定。
<ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}, Converter={StaticResource YourConverter}}"
ContentStringFormat="Turn on {0}">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.