[ACCEPTED]-Customizing the toggle state of a toggle button in wpf-togglebutton
The issue here is because you are using 11 Image
resources. The Image
in your resources is a 10 concrete instance of a control. It can 9 only be in one place at a time. So when 8 you have more than one item in your list...
This 7 should work for you:
<Style x:Key="OnOffToggleImageStyle" TargetType="ToggleButton">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content">
<Setter.Value>
<Image Source="C:\ON.jpg" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content">
<Setter.Value>
<Image Source="C:\OFF.jpg" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
Note that you can improve 6 the performance of this by using an ImageSource
for 5 each image file in your resources, then 4 referencing this in the Image
. This effectively 3 means that each image is only loaded once 2 from disk, rather than 2*N times (where 1 N is the number of items in your list.)
This answer will help you. In there I took a ToggleButton 9 and styled it to look as the ToggleButton 8 in a TreeView (the + / - part to expand 7 collapse nodes). You'll just need to change 6 the paths that draw the - and + signs, to 5 show your images instead.
Here goes personalized 4 to you, just put an image called "on.jpg" and 3 another one called "off.jpg" under 2 your C:\ directory, and it should work by 1 just copy/pasting into your window:
<Window.Resources>
<SolidColorBrush x:Key="GlyphBrush" Color="#444" />
<ControlTemplate x:Key="toggleButtonTemplate" TargetType="ToggleButton">
<Grid
Width="15"
Height="13"
Background="Transparent">
<Image x:Name="ExpandImage"
Source="C:\off.jpg"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="1,1,1,1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Source"
TargetName="ExpandImage"
Value="C:\on.jpg"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="toggleButtonStyle" TargetType="ToggleButton">
<Setter Property="Template" Value="{StaticResource toggleButtonTemplate}" />
</Style>
</Window.Resources>
<Grid>
<ToggleButton Style="{StaticResource toggleButtonStyle}" />
</Grid>
Here is a ToggleButton with 3 images and 8 a popup:
- An image for when IsChecked = false.
- An image for when IsChecked = true.
- An image for when IsMouseOver = true.
The images are stored in resources 7 as BitmapImage in order to avoid changing 6 Visuals on trigers.
The image files have 5 to be added to resources and then, the files 4 added to the "Resoruces" folder in the project 3 have to be marked as BuildAction = Resource.
It also applies an 2 opacity to the Image control when the ToggleButton 1 IsEnabled = false;
Code:
<ToggleButton
x:Name="btnToggleImage"
Margin="5"
Width="50"
Height="50"
>
<ToggleButton.Resources>
<BitmapImage x:Key="imgNormal" UriSource="/YOURPROJECTNAME;component/Resources/YourUncheckedImage.png"/>
<BitmapImage x:Key="imgHover" UriSource="/YOURPROJECTNAME;component/Resources/YourHoverImage.png"/>
<BitmapImage x:Key="imgChecked" UriSource="/YOURPROJECTNAME;component/Resources/YourCheckedImage.png"/>
</ToggleButton.Resources>
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Image
x:Name="PART_Image"
Source="{StaticResource imgNormal}"
/>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="PART_Image" Property="Source" Value="{StaticResource imgChecked}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="PART_Image" Property="Source" Value="{StaticResource imgHover}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="PART_Image" Property="Opacity" Value="0.6"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
<Popup
x:Name="popup1"
PlacementTarget="{Binding ElementName=btnToggleImage}"
PopupAnimation="Slide"
IsOpen="{Binding ElementName=btnToggleImage, Path=IsChecked, Mode=TwoWay}"
StaysOpen="False"
MinWidth="{Binding ElementName=btnToggleImage, Path=Width}">
<Grid Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">
<!--<ItemsPresenter/>-->
<Label Content="Hello Wolrd!"/>
</Grid>
</Popup>
Like Drew Noakes said, in my snippte there 6 were only two images. So only two items 5 were working properly. I solved this issue 4 with the following snippet.
<ToggleButton
Grid.Row="0" Grid.Column="2" Grid.RowSpan="2"
VerticalAlignment="Center" HorizontalAlignment="Center"
IsChecked="{Binding Status}"
Width="100" Height="35">
<ToggleButton.Resources>
<Image x:Key="OnImage" Source="C:\ON.jpg" />
<Image x:Key="OffImage" Source="C:\OFF.jpg" />
</ToggleButton.Resources>
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="{StaticResource OnImage}">
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content" Value="{StaticResource OffImage}">
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
Simple, I 3 moved the triggers in to the data template. Dunno 2 whether this is the correct answer thou'. Seems 1 to be working
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.