| 

.NET C# Java Javascript Exception

8
Ich habe unter WPF ein Problem mit einem Style von mir und zwar wenn ich diesen ToggleButton-Style nur einmal verwende passt das, möchte ich diesen aber mehrfach benutzen, knallt es im Form von
"Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch.",

ändere ich den Key funktioniert es, kann nur leider diesen Style nicht 50mal kopieren :/

Die Grafiken sind im Buildvorgang als Resource und auf "Immer kopieren" definiert.



<Style x:Key="ToggleButtonStyle" TargetType="ToggleButton">
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid Width="140">
<ContentPresenter Name="content" Height="23" Width="49" HorizontalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter Property="Content">
<Setter.Value>
<Image Source="../Images/ToggleOff.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content">
<Setter.Value>
<Image Source="../Images/ToggleOn.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Content">
<Setter.Value>
<Image Source="../Images/ToggleOff.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</Setter.Value>
</Setter>
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
11.12.2011
Mario Priebe 6,0k 3 9
Hllo Mario, ich habe meine Antwort noch um einen Kommentar ergänzt. Dürfte Dich interessieren :-)
Andreas Ganzer 18.12.2011
1 Antwort
6
Die Trigger müssen so aussehen ("ContentTemplate" statt "Content" und "DataTemplate" als Value):

<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="../Images/ToggleOff.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</DataTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="../Images/ToggleOn.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</DataTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="../Images/ToggleOff.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
</DataTemplate>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
12.12.2011
Andreas Ganzer 1,4k 1 8
perfekt, danke dir!
Mario Priebe 12.12.2011
2
Ich bin eben zufällig über eine andere Lösung gestoßen, die mir wesentlich eleganter erscheint (und von Microsoft wohl auch so gedacht war):

<Image Source=... x:Shared=False/>

Ich habe es jetzt nicht ausprobiert, es sheint mir aber ganz logisch. Normalerweise wird immer nur ein Exemplar von einer Ressource erstellt, das alle Elemente sich teilen. Bei Ressourcen wie einem Pinsel geht das, weil diese nicht im Elementbaum eingetragen werden. Oberflächenelemente können aber nicht mehrmals in einer Oberfläche verwendet werden. x:Shared schaltet dieses Verhalten ein und aus (Standard ist True).
Andreas Ganzer 18.12.2011
Wow, das hört sich gut an, ich schaue mir das später auf jeden Fall mal an. Danke dir!
Mario Priebe 18.12.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH