none
Source für Image aus Style.Resources im ControlTemplate binden RRS feed

  • Frage

  • Hallo,

    ich habe eine TextBox, die ich in bestimmten Situationen mit verschiedenen Styles aber immer mit dem gleichen ControlTemplate darstellen möchte. Alles soll in XAML definiert werden. Da ich mit den verschiedenen Styles nicht nur Eigenschaften der TextBox ändere sondern auch ein bestimmtes Image anzeigen möchte, soll das jeweilige Image las Resource im Style vorhanden sein. Im nachfolgenden ist einer der Styles den ich verwende gezeigt:

    <Style x:Key="TextBoxStyleError" TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxStyleFocus}">
    	<Style.Resources>
    		<Image x:Key="MessageImage" Source="../Images/Message_Error_ALLG_16x16.png"/>
    	</Style.Resources>
    	<Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxBorderWarning}"/>
    	<Setter Property="TextBox.BorderThickness" Value="2"/>
    	<Setter Property="Template" Value="{DynamicResource TextBoxCTMessage}">		
    	</Setter>		
    </Style>
    Dieser Style befindet sich in einer eigenen ResourceDictionary-Datei. Nun habe ich wie schon oben beschrieben für alle Styles die ich verwende immer das gleiche ControlTemplate. Dieses ControlTemplate sieht wie folgt aus:

    	<ControlTemplate x:Key="TextBoxCTMessage" TargetType="{x:Type TextBox}">
    		<Grid x:Name="LayoutRoot">
    			<Grid.ColumnDefinitions>
    				<ColumnDefinition Width="*"/>
    				<ColumnDefinition Width="Auto" MinWidth="16"/>
    			</Grid.ColumnDefinitions>
    			<Grid.RowDefinitions>
    				<RowDefinition Height="Auto" MinHeight="16"/>
    				<RowDefinition Height="*"/>
    			</Grid.RowDefinitions>
    			<Border x:Name="Bd" SnapsToDevicePixels="True" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" Margin="0,7.2,8,0" Grid.ColumnSpan="2" Grid.Row="0" d:LayoutOverrides="Width, Height" BorderBrush="{TemplateBinding BorderBrush}" Grid.RowSpan="2">
    				<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    			</Border>
    			<Image HorizontalAlignment="Left" Source="{DynamicResource MessageImage}" Margin="0" VerticalAlignment="Bottom" Width="16" Grid.Row="0" Grid.RowSpan="1" Height="16" Grid.Column="1" Grid.ColumnSpan="1" Stretch="Fill"/>
    		</Grid>
    		<ControlTemplate.Triggers>
    			<Trigger Property="IsEnabled" Value="False">
    				<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    			</Trigger>
    		</ControlTemplate.Triggers>
    	</ControlTemplate>
    Dieses ControlTemplate befindet sich ebenfalls in einer eigenen ResourceDictionary-Datei. Nun möchte ich sehr gerne die Source des Image aus dem ControlTemplate an die Source des Image aus dem Style binden. OK, wenn ich DynamicResource und den Key des Image aus dem Style verwende bekomme ich leider eine Ausnahme mit dem folgenden Hinweis: System.InvalidCastException: Das Objekt des Typs "System.Windows.Controls.Image" kann nicht in Typ "System.Windows.Media.ImageSource" umgewandelt werden. Hmpf, ich denke das ich irgendwie angeben muss, das ich genau auf die Source-Eigenschaft des Image aus dem Style binden will. Gebe ich aber MessageImage.Source an, funktioniert das ganze auch nicht. Verwende ich hingegen einen ContentPresenter im ControlTemplate und binde dessen Content-Eigenschaft auf die Resource aus dem Style funktioniert es.
    Kann mir jemand sagen wie ich das mit Image im ControlTemplate hinbekomme?

    Vielen Dank
    TOM_MUE (Thomas Müller)
    Donnerstag, 8. Oktober 2009 12:26

Alle Antworten

  • Hi,

    warum machst du dir nicht einfach ein neues Objekt welches die ImageSource als Eigenschaft bindet? Dieses Objekt kannst du doch dann ganz einfach an die Eigenschaft binden....?!
    Freitag, 9. Oktober 2009 11:58
  • Hi Techtwebty
    Hi,

    warum machst du dir nicht einfach ein neues Objekt welches die ImageSource als Eigenschaft bindet? Dieses Objekt kannst du doch dann ganz einfach an die Eigenschaft binden....?!
    ... weil der einfachste Weg in der Praxis nicht immer im Rahmen der Möglichkeiten liegt ;-) Es hat sich sogar herausgestellt das mein Aufbau von Styles und Template, bis auf die Implementierung des Image-Objekts innerhalb des ControlTemplates, sehr gut funktioniert und genau unseren Bedarf abdeckt. Ich habe lediglich das Image gegen einen ContentPresenter getauscht. So kann nun auch jeder Zeit im Style das Image gegen ein XAML-Symbol getauscht werden. Oder gegen ein anderes Element. Dabei verliert das ControlTemplate nicht seine Gültigkeit. Trotzdem vielen Dank für Deine Antwort, auch wenn sie nicht weiterhilft.

    Gruß
    TOM_MUE (Thomas Müller)
    Freitag, 9. Oktober 2009 15:48