2012-04-04 10 views
0

Ich bin neu hier und hoffe, meine erste Frage erfüllt Stack Overflow Anforderungen. Ich habe bisher einige Nachforschungen angestellt, konnte es aber selbst nicht herausfinden.
Ich erstelle ein UserControl (abgeleitet von einer Zwischenbasisklasse), das in der Lage sein sollte, ein Farbzeichen in eine andere Farbe zu ändern, abhängig von seiner Eigenschaft "VisualAlarmState", die eine DependencyProperty ist.
Der Style plus ControlTemplate wird wie erwartet gerendert, aber der DataTrigger am Ende des Styles ändert nicht die Farbe (= Bild) von VisualAlarmSign, das ein Image-Element ist.
Der Code kann kompiliert und ohne Fehler ausgeführt werden, aber der Alarmstatus wird nicht wie erwartet angezeigt.
Etwas, was ich wirklich verstehe: Ich muss den Stil dynamisch referenzieren, weil Style = "{StaticResource DashboardItemStyle}" unterlegt ist und beim Maus-Hover sagt: "Die Ressource" DashboardItemStyle "konnte nicht aufgelöst werden."DataTrigger in ControlTemplate funktioniert nicht

<ucbase:DashboardItemBase.Resources> 
      <BitmapImage x:Key="MO-Zylinderdeckel" UriSource="/ModuleDashboard;component/Resources/MO-Zylinderdeckel.tif" /> 
      <BitmapImage x:Key="MO-Zylindermantel" UriSource="/ModuleDashboard;component/Resources/MO-Zylindermantel.tif" /> 
      <BitmapImage x:Key="MO-Zylinderboden" UriSource="/ModuleDashboard;component/Resources/MO-Zylinderboden.tif" /> 
      <BitmapImage x:Key="MO-Marker-Grün" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Grün.tif" /> 
      <BitmapImage x:Key="MO-Marker-Orange" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Orange.tif" /> 
      <BitmapImage x:Key="MO-Marker-Rot" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Rot.tif" /> 

    <Style x:Key="DashboardItemStyle" TargetType="{x:Type ucbase:DashboardItemBase}"> 

     <Setter Property="Template" x:Name="Template1"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ucbase:DashboardItemBase}">       
        <dxlc:Tile x:Name="Tile" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
          Height="128.5" Width="208.5" Background="{x:Null}"> 
         <dxlc:Tile.Content> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="11.5" /> 
            <RowDefinition Height="*" /> 
            <RowDefinition Height="12.5" /> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="6.5" /> 
           </Grid.ColumnDefinitions> 

           <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
             HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch" 
             Source="{StaticResource MO-Zylinderdeckel}" /> 

           <Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Grid.RowSpan="1"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="*" /> 
             <ColumnDefinition Width="6.5" /> 
            </Grid.ColumnDefinitions> 
            <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="2" 
              HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch" 
              Source="{StaticResource MO-Zylindermantel}" /> 


             <Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Height="14" 
              Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right" 
              VerticalAlignment="Top" Source="{StaticResource MO-Marker-Grün}" /> 
           </Grid> 

           <Image Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="3" Grid.RowSpan="1" 
             HorizontalAlignment="Stretch" Stretch="Fill" VerticalAlignment="Stretch" 
             Source="{StaticResource MO-Zylinderboden}" /> 
          </Grid> 
         </dxlc:Tile.Content> 
        </dxlc:Tile> 

        <ControlTemplate.Triggers> 

         <!-- This Trigger has no effect. Why?--> 
         <DataTrigger 
           Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=VisualAlarmState}"> 
          <DataTrigger.Value> 
           <vmbase:AlarmState>Alarm</vmbase:AlarmState> 
          </DataTrigger.Value> 
          <Setter TargetName="VisualAlarmSign" Property="Source" 
            Value="{StaticResource MO-Marker-Rot}" /> 
         </DataTrigger>      </ControlTemplate.Triggers> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ucbase:DashboardItemBase.Resources> 

Arbeitslösung

I entfernt Source={StaticResource MO-Marker-Grün} vom <Image> Elemente und ich zog die <DataTrigger> von <ControlTemplate.Triggers> zu <Style.Triggers> in <Image.Style>, die in dem folgenden XAML-Code zur Folge:

<ucbase:DashboardItemBase.Resources> 
    ... 
    <BitmapImage x:Key="MO-Marker-Rot" UriSource="/ModuleDashboard;component/Resources/MO-Marker-Rot.tif" /> 
    ... 
     <Style x:Key="DashboardItemStyle" TargetType="{x:Type ucbase:DashboardItemBase}"> 
      <Setter Property="Template" x:Name="Template1"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ucbase:DashboardItemBase}">       
         <dxlc:Tile x:Name="Tile" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
           Height="128.5" Width="208.5" Background="{x:Null}"> 
          <dxlc:Tile.Content> 
           <Grid> 
            ...          
            <Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" 
              Height="14" Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right" 
              VerticalAlignment="Top" > 
             <Image.Style> 
              <Style> 
               <Style.Triggers> 
                <DataTrigger 
                  Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=VisualAlarmState}" 
                  Value="Alarm"> 
                 <Setter Property="Image.Source" 
                   Value="{StaticResource MO-Marker-Rot}" /> 
                </DataTrigger> 
               </Style.Triggers> 
              </Style> 
             </Image.Style> 
            </Image> 
            ... 
           </Grid> 
          </dxlc:Tile.Content>       
         </dxlc:Tile>       
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
</ucbase:DashboardItemBase.Resources> 
+0

Code sieht gut aus. Überprüfen Sie, ob in Ihrem Ausgabe-ToolWindow Bindungsfehler vorliegen. Haben Sie versucht, den Alarmstatus an einen normalen Textblock zu binden, nur um sicherzustellen, dass die Verbindung zum DP ordnungsgemäß funktioniert? – SvenG

+0

Übrigens, wenn AlarmState enum ist, können Sie einfach Value = "Alarm" in einem Trigger ohne Angabe des Typs verwenden. –

+0

@ Marat Khasanov: Danke für diesen Ratschlag
@SvenG: VisualAlarmState funktioniert perfekt mit der Bindung an eine Label.Content –

Antwort

0

Versuchen Sie, die Quelle des Bildes mit dem Stylesheet zu setzen. Einige, wie Trigger verhalten sich verdrahtet.

<Image x:Name="VisualAlarmSign" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Height="14" 
              Margin="0,20,0,0" Width="19.5" HorizontalAlignment="Right" 
              VerticalAlignment="Top"> 
    <Image.Style> 
    <Style> 
    <Setter TargetName="VisualAlarmSign" Property="Source" 
             Value="{StaticResource MO-Marker-Grün}" /> 
    </Style> 
    </Image.Style> 
</Image> 

Achten Sie auf die Quelleigenschaft in dem Image-Tag zu entfernen.

Einige der Auslöser können Eigenschaften, die wir im Tag verwendet haben, nicht festlegen. In diesem Fall legen Sie den Wert der Quelle im Image-Tag fest. Wenn Sie denselben Wert über den Style-Setter setzen, kann es Wurm sein. es ist einen Versuch wert.

+0

Die Verwendung von Image.Style funktioniert nicht, weil ich einen Kompilierungsfehler erhalte: "TargetName Eigenschaft kann nicht auf einen Style festgelegt werden Setter." –

+0

Zielnamen im Setter entfernen .. Wir brauchen keinen Zielnamen im Setter, weil wir den Stil für das gleiche Objekt festlegen .. Sie müssen möglicherweise Property = "Image.Source" an Stelle von Property = "Source" – Bathineni

+0

verwenden Danke, die Ausnahme ist jetzt weg, aber der Auslöser hat immer noch keine Wirkung. –