![](/img/trans.png)
[英]Bind several ToggleButton IsEnabled property to other 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.