我定义了一个共享的ToggleButton样式,它在IsChecked是true时显示一个图像,当IsChecked是false时显示一个不同的图像。将IsChecked绑定到ViewModel上的布尔属性可以很好地显示所需的图像,因此我知道正在应用我的样式,而绑定到IsChecked的DataTrigger工作。
当ToolTip发生变化时,我想更改IsChecked文本,但是我很难做到这一点。理想情况下,我希望ToolTip在未检查时说“打开”,在选中时说“关闭”。
问题是ToolTip没有连接到可视树中的ToggleButton,所以我需要另一种方法来找到ToggleButton.IsChecked。我试图完全以一种风格来做这件事,因为我有很多这样的按钮分散在周围,所以不允许对VM进行更改。
理想情况下,解决方案将允许我使用ToggleButton.Tag存储文本,并应用Converter和StringFormat (或ContentStringFormat)。我已经重写了ContentTemplate,并将其替换为一个基本的ContentPresenter,以消除典型的ToggleButton效果,因此在必要时可以对其进行进一步的更改。(也许我已经删除了一些重要的东西让这件事起作用?(闲谈)
这里是我的风格,可以改变形象,但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"/>发布于 2022-04-01 07:30:27
StringFormat不适用于ToolTip,因为它可以包含object类型的任意内容,而不仅仅是纯文本。但是,ToolTip公开可以使用的属性ContentStringFormat。
string.
获取或设置一个复合
string,该复合string指定如果Content属性显示为,如何格式化该属性。
由于ToolTip驻留在单独的弹出窗口中,因此它与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}">https://stackoverflow.com/questions/71702789
复制相似问题