首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用控件样式,如何基于ToolTip绑定或触发对ToggleButton.IsChecked内容的更改?

使用控件样式,如何基于ToolTip绑定或触发对ToggleButton.IsChecked内容的更改?
EN

Stack Overflow用户
提问于 2022-04-01 06:40:18
回答 1查看 79关注 0票数 1

我定义了一个共享的ToggleButton样式,它在IsCheckedtrue时显示一个图像,当IsCheckedfalse时显示一个不同的图像。将IsChecked绑定到ViewModel上的布尔属性可以很好地显示所需的图像,因此我知道正在应用我的样式,而绑定到IsCheckedDataTrigger工作。

ToolTip发生变化时,我想更改IsChecked文本,但是我很难做到这一点。理想情况下,我希望ToolTip在未检查时说“打开”,在选中时说“关闭”。

问题是ToolTip没有连接到可视树中的ToggleButton,所以我需要另一种方法来找到ToggleButton.IsChecked。我试图完全以一种风格来做这件事,因为我有很多这样的按钮分散在周围,所以不允许对VM进行更改。

理想情况下,解决方案将允许我使用ToggleButton.Tag存储文本,并应用ConverterStringFormat (或ContentStringFormat)。我已经重写了ContentTemplate,并将其替换为一个基本的ContentPresenter,以消除典型的ToggleButton效果,因此在必要时可以对其进行进一步的更改。(也许我已经删除了一些重要的东西让这件事起作用?(闲谈)

这里是我的风格,可以改变形象,但ToolTip永远不会改变。

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

按钮本身的定义与此类似:

代码语言:javascript
复制
<ToggleButton Style="{StaticResource OnOffToggleButton}" 
              IsChecked="{Binding IsPoweredOn, Mode=OneWay}" 
              Command="{Binding TogglePowerCommand}" 
              Tag="Device Power"/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-01 07:30:27

StringFormat不适用于ToolTip,因为它可以包含object类型的任意内容,而不仅仅是纯文本。但是,ToolTip公开可以使用的属性ContentStringFormat

string.

获取或设置一个复合string,该复合string指定如果Content属性显示为,如何格式化该属性。

由于ToolTip驻留在单独的弹出窗口中,因此它与ToggleButton不是同一视觉树的一部分,但是您可以使用ToolTipPlacementTarget来引用它。

获取或设置打开ToolTip时相对于其位置的UIElement

代码语言:javascript
复制
<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绑定中应用转换器。

代码语言:javascript
复制
<ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}, Converter={StaticResource YourConverter}}"
         ContentStringFormat="Turn on {0}">
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71702789

复制
相关文章

相似问题

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