繁体   English   中英

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

[英]Using a control style, how can you bind or trigger a change to ToolTip contents based on ToggleButton.IsChecked?

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

我想在IsChecked更改时更改ToolTip文本,但我在让它工作时遇到了很多麻烦。 理想情况下,我希望ToolTip在未选中时显示“打开”之类的内容,在选中时显示“关闭”之类的内容。

问题是ToolTip没有连接到可视化树中的ToggleButton ,所以我需要另一种方法来找到ToggleButton.IsChecked 我正在尝试完全以一种风格来执行此操作,因为我周围散布着相当多的这些按钮,因此不允许对 VM 进行任何更改。

理想情况下,该解决方案将允许我使用ToggleButton.Tag来存储文本,并应用ConverterStringFormat (或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不属于同一可视化树,但您可以使用ToolTipPlacementTarget引用它。

获取或设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM