2012-04-04 26 views
0

私はここで新しく、最初の質問がスタックオーバーフローの要件を満たすことを願っています。私はこれまでのところいくつかの研究を行ってきましたが、自分でそれを理解することはできませんでした。
私はDependencyPropertyである "VisualAlarmState"プロパティに応じて、色記号を別の色に変更できるはずのUserControl(中間基本クラスから派生したもの)を作成します。
スタイル+ ControlTemplateは期待どおりにレンダリングされますが、スタイルの最後のDataTriggerはImage要素であるVisualAlarmSignの色(=画像)を変更しません。
コードをコンパイルしてエラーなしで実行できますが、アラーム状態は期待どおりに表示されません。

スタイル= "{StaticResource DashboardItemStyle}"がアンダーライドされ、マウスのホバーで次のように表示されるため、スタイルを動的に参照する必要があります: "リソース" DashboardItemStyle "を解決できませんでした。ControlTemplateのDataTriggerが機能しません

<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> 

作業溶液

私は<Image>要素からSource={StaticResource MO-Marker-Grün}を削除し、私は次のXAMLコードをもたらした<Image.Style><ControlTemplate.Triggers>から<Style.Triggers><DataTrigger>を移動:

<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

コードは正常です。 Output ToolWindowにバインドエラーがあるかどうかを確認してください。 DPへのバインディングが正常に動作していることを確認するために、通常のテキストブロックにアラームステートメントをバインドしようとしましたか? – SvenG

+0

ちなみに、AlarmStateがenumの場合、タイプを指定せずに単にTriggerでValue = "Alarm"を使用することができます。 –

+0

@ Marat Khasanov:このアドバイスをありがとうございます。
@SvenG:VisualAlarmStateはLabel.Contentへのバインディングで完璧に動作します –

答えて

0

スタイルプロパティー設定ツールを使用して画像のソースを設定してみてください。トリガーがどのように動作するのか。

<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> 

イメージタグのsourceプロパティを削除してください。

いくつかのトリガーは、タグで使用したプロパティを設定できない場合があります。あなたの場合、イメージタグにsourceの値を設定します。スタイルセッターで同じ値を設定すると、ワームが発生する可能性があります。それは試みに値します。

+0

Image.Styleを使用すると、コンパイル時にエラーが発生するため、使用できません: "TargetNameプロパティはスタイルセッター " –

+0

setterのターゲット名を削除します。同じオブジェクトのスタイルを設定しているので、setterにtargetnameは必要ありません。Property = "Source"の代わりにProperty = "Image.Source"を使用する必要があります – Bathineni

+0

ありがとう、例外は今行っているが、引き金はまだ効果がありません。 –