簡體   English   中英

單擊WPF ToggleButton更改其他ToggleButtons值

[英]Clicking on WPF ToggleButton changes other ToggleButtons values

我有一個帶有樣式觸發器的簡單ToggleButton,可以根據IsChecked的狀態更改按鈕的圖像。 一鍵工作正常。 但是,當我向網格中添加多個按鈕時,單擊ToggleButtons之一會更改其他按鈕的狀態。 我是否應該使用其他觸發類型,而不是基於波頓風格的觸發類型?

這是xaml塊,用於布置三個ToggleButtons:

   <Grid Height="362" Width="259">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True"
              Width="15" Height="15" Grid.Row="0" Grid.Column="0"/>
        <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True"
              Width="15" Height="15" Grid.Row="1" Grid.Column="0"/>
        <ToggleButton Style="{StaticResource TogglebuttonStyle}" IsChecked="{x:Null}" IsThreeState="True"
              Width="15" Height="15" Grid.Row="2" Grid.Column="0"/>
    </Grid>

這是帶有觸發器的樣式:

   <Style x:Key="TogglebuttonStyle" TargetType="ToggleButton">
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source="{StaticResource ImagePlus}"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsChecked" Value="False">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source="{StaticResource ImageMinus}"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsChecked" Value="{x:Null}">
                <Setter Property="Content">
                    <Setter.Value>
                        <Image Source="{StaticResource ImageNeutral}"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

我將其稱為解決方法,但是現在每個按鈕都保留其自己的狀態:

我發現,如果我將樣式塊從App.xaml中移出(在標記內)並為每個按鈕定義了樣式觸發器,則問題行為就消失了。 由於我是WPF / XAML的新手,因此不確定它是實際的解決方案還是變通的解決方法。 用這種方式指定事物似乎是多余的。

<ToggleButton IsChecked="True" IsThreeState="True"
          Width="25" Height="25" Grid.Row="2" Margin="-1,19,1,-19">
    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Content">
                        <Setter.Value>
                            <Image Source="{StaticResource ImagePlus}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
                <Trigger Property="IsChecked" Value="False">
                    <Setter Property="Content">
                        <Setter.Value>
                            <Image Source="{StaticResource ImageMinus}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
                <Trigger Property="IsChecked" Value="{x:Null}">
                    <Setter Property="Content">
                        <Setter.Value>
                            <Image Source="{StaticResource ImageNeutral}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

問題是設置器實例化了Image控件的一個實例,該實例只能有一個父對象。 然后,按鈕進入“ ImagePlus”狀態,一切正常。 當第二個按鈕進入該狀態時,該Image控件將移動到新的父對象,而使舊的控件失去作用。

這是XAML具有模板的原因之一:實例化模板時,將實例化該可視樹代碼片段的新實例。 Presto,沒有共享問題。

使用某些資源,您可以在資源上設置x:Shared="False"並解決此問題。 我找不到在這里進行這項工作的方法(我還沒有弄清楚確切的時間原理何時有效以及何時無效。) 所以我改為使用DataTemplates來做到這一點:

<Style x:Key="TogglebuttonStyle" TargetType="ToggleButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Image Source="{StaticResource ImagePlus}" />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="IsChecked" Value="False">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Image Source="{StaticResource ImageMinus}" />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="IsChecked" Value="{x:Null}">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Image Source="{StaticResource ImageNeutral}" />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

經過更多研究后,我發現必須指定不共享樣式。

<Style x:Key="ToggleButtonStyle" x:Shared="False" /Style>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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