![](/img/trans.png)
[英]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.