1

コントロールのフォアグラウンドの値を使用して、ControlTemplateのVisualStateColorAnimationのソースとして使用したいと思います。

私のテンプレート定義は、主にToggleButtonの標準テンプレートに似ていますが、いくつかのmodがあります(<<< ..... >>>とマークされています)。

<Style TargetType="ToggleButton>
  <Setter .../>
  ...
  <<< <Setter Property="Foreground" Value="#FF000000"/> >>>
  ...
  <Setter .../>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ToggleButton">
        <Grid>
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
              <VisualState .../>
              <VisualState x:Name="PointerOver">
                <Storyboard>
                  <ColorAnimation Duration="0" Storyboard.Target="BackgroundGradient" Storybord.TargetProperty="(Rectangel.Fill).(GradientBrush.GradientStop)[1].(GradientStopColor)" <<< To="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" >>> />
                </Storyboard>
              </VisualState>
      ...
    ...
  ...
</Style>
...
...
<ToggleButton <<< Foreground="#FFFF0000" >>> ...../>

そのため、アニメーションがマウスオーバーアニメーションの一部として設定された前景色(#FFFF0000)を使用することを期待していましたが、まったく何もしませんでした。アニメーション定義にTo="#FFFF0000"と書くと、期待どおりの結果が得られますが、アニメーションの色を動的に保ち、アプリのToggleButtonごとに異なる色にしたいです。

これを修正する方法はありますか?

お願いします!

編集:1つのGradientStopを{TemplateBinding Foreground}にバインドする必要があるContentPresenterにLinearGradientBrushを使用して新しいRectangleを追加することにより、上記と同様の効果を達成しようとした後、問題の理由を明らかにする可能性のあるエラーが発生します。タイプ「Windows.UI.xaml.DependencyProperty」をタイプ「System.Windows.DependencyProperty」に変換することはできません。」{TemplateBinding ...}が間違ったタイプのDependencyPropertyを生成するか、GradientStopがWindowsストアアプリで間違ったタイプを予期しているようです。でも!XAMLでの明示的な型キャストまたはその他の回避策によってこれを克服する方法はありますか?

ありがとう

4

1 に答える 1

2

それで、私は最終的にそれを自分で解決しました。

エラーメッセージが表示された後 (元の投稿の「編集」を参照)、適切なコンバーターを作成しようとしましたが、明らかなことを見ていなかったので、自分自身を蹴ることができました!

WinRT や TemplateBinding、または Windows.UI.Xaml <-> と System-Windows オブジェクト間の非互換性とは何の関係もありませんでした。

GradientStopColor が Color を期待しているのに、Foreground が Brush タイプ (私の場合は SolidColorBrush) であることに気付きませんでした!

BrushToColorConverter を作成し、これを RelativeSource バインディングに関連して使用すると (TemplateBinding ではコンバーターが許可されないため)、機能しました。

  XAML:
<Page.Resources>
  <local:BrushToColorConverter x:Key="Brush2Color" DefaultOpacity="1.0"/>
</Page.Resources>
...
<ColorAnimation Duration="0" 
                Storyboard.TargetName="BackgroundGradient"
                Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" 
                To="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
                     Path=Foreground, 
                     Converter={StaticResource Brush2Color}, 
                     ConverterParameter=0.5}"
/>


CodeBehind:
public class BrushToColorConverter : IValueConverter
{
  private double defaultOpacity = 1;
  public double DefaultOpacity
  {
    set { defaultOpacity = value; }
  }

  public object Convert(object value, Type targetType, object parameter, string culture)
  {
    SolidColorBrush brush = value as SolidColorBrush;
    double opacity;

    if (!Double.TryParse((string)parameter, out opacity))
      opacity = defaultOpacity;

    if (brush == null)
      return Colors.Transparent;
    else
      return Color.FromArgb((byte)(255.0 * brush.Opacity * opacity), 
                            brush.Color.R, 
                            brush.Color.G, 
                            brush.Color.B
                           );
  }

  public object ConvertBack(object value, Type targetType, object parameter, string culture)
  {
    return null;
  }
}
于 2012-09-21T20:14:00.077 に答える