[英]Reuse ToggleButton-Style in WPF
我有以下ToggleButton樣式:
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content">
<Setter.Value>
<Image Source="{StaticResource Graph}" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content">
<Setter.Value>
<Image Source="{StaticResource Graph_Off}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我試圖將其重復用於我的ToggleButtons(這是一個列表)-因此列表中的每個項目都有一個ToggleButton。 問題是,當我單擊ToggleButton時,未被單擊的按鈕圖標消失了。 只有我單擊的按鈕才能顯示所需的圖像...這種樣式是否做錯了?
我的ToggleButton的實現:
<ToggleButton Style="{StaticResource GraphToggleButtonStyle}"
ToolTip="{x:Static res:Resources.UseGraphToggle}"
Visibility="{Binding Selected,
Converter={StaticResource BoolToVisibilityConverter}}" />
每當按鈕IsChecked
屬性更改時,就不需要將子項(圖像)添加到可視樹中。
問題是樣式默認情況下是共享的,除非您設置x:Shared="False"
並且第二,任何Visual只能添加到一個Visual樹中 。 如果在另一棵可視樹中添加Visual,它將從先前的可視樹中刪除。 在您的情況下,視覺效果是圖像控件。
在您的情況下,可以使用x:Shared="False"
設置,但這會破壞資源的可重用性功能。 所以,我建議,而不是創建新實例Image
控制每次, 創建Image控件只有一次,在觸發改變映像源 。
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image x:Name="image"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=ToggleButton}}" Value="True">
<Setter TargetName="image" Property="Source"
Value="{StaticResource Graph}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsChecked,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=ToggleButton}}" Value="False">
<Setter TargetName="image" Property="Source"
Value="{StaticResource Graph_Off}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
您風格的Image
是視覺效果。 一個視覺只能在視覺樹中使用一次。 不要重復使用樣式,而讓WPF每次引用它時都創建一個新樣式:
<Style x:Key="GraphToggleButtonStyle" TargetType="ToggleButton" x:Shared="False">
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.