3

コントロール テンプレート内から VisualStates を定義した場合、テンプレート化されたコントロール自体のプロパティをストーリーボードから変更することはできますか? 簡単な例を次に示します。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Window.Template>
    <ControlTemplate TargetType="{x:Type Window}">
      <Grid>
        <VisualStateManager.VisualStateGroups>
          <VisualStateGroup x:Name="WindowStyleStates"
                            x:Uid="WindowStyleStates">
            <Storyboard x:Uid="Storyboard_1">
              <ObjectAnimationUsingKeyFrames Storyboard.TargetName="?????"
                                             Storyboard.TargetProperty="ResizeMode">
                <DiscreteObjectKeyFrame KeyTime="0"
                                        Value="CanResizeWithGrip" />
              </ObjectAnimationUsingKeyFrames>
            </Storyboard>
          </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
      </Grid>
    </ControlTemplate>
  </Window.Template>
</Window>

問題は、ストーリーボードがグリッド内で定義されたオブジェクトにしかアクセスできないことです。ウィンドウのコントロール テンプレートを定義している場合、テンプレート化しているウィンドウの値を変更できないのはなぜですか。

4

1 に答える 1

1

ControlTemplateにアクセスするためには必要ありませんVisualStateManager。私は試していませんが、これでうまくいくはずです。

<Window x:Name="YourWindow" ...>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="WindowStyleStates" x:Uid="WindowStyleStates">
            <Storyboard x:Uid="Storyboard_1">
                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="YourWindow"
                                               Storyboard.TargetProperty="ResizeMode">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="CanResizeWithGrip"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
</Window>

VisualStateManager.GoToState(...)しかし、少なくとも .Net 3.5 では、コード ビハインドに問題があるようです。しかし、回避策があります。これがあなたにとって重要かどうかはわかりません。

タイトルの質問に答えるには:コントロールのテンプレート化の背後にある概念を少し誤解していると思います。小さな例...

<!-- A simple button with round corners -->
<Button>
  <Button.Template>
    <ControlTemplate>
      <Border x:Name="ButtonBorder"
              CornerRadius="10"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}">
        <Grid>
          <ContentPresenter x:Name="ButtonContent"
                            Content="{TemplateBinding Content}" />
          <Border x:Name="ButtonBackground"
                  Background="{TemplateBinding Background}"
                  BorderBrush="{x:Null}"
                  BorderThickness="0" />
        </Grid>
      </Border>
    </ControlTemplate>
  </Button.Template>
</Button>

ご覧のとおり、テンプレートによってButton新しい外観が得られます。さらに、視覚的な動作もオーバーライドされます。この場合、ボタンは期待どおりに機能しますが、視覚的な動作はありません。
視覚的な動作を定義するにはVisualStateManager、事前定義された状態またはカスタム状態を使用できます。ただし、ボタンのルック アンド フィールを再実装する必要があるため、テンプレート内の要素のみを変更できます。したがって、ButtonBorderVisualStateManagerに aを追加します。

于 2013-04-12T06:40:38.757 に答える