簡體   English   中英

在WPF中重用ToggleButton樣式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM