0

Silverlight4UserControlで不可解な制限に遭遇しました。

私が達成しようとしているのは、ボタンを押すと最小化された状態からスライドするパネルを作成することですが、そのタイトルバーはドラッグ可能であり、この最大化された状態のサイズを変更できます。

スライドアウトのために私が行ったことは、このパネルの親グリッドのMaxHeightプロパティをアニメーション化することです。これは、パネルにハードコードされた高さがなくても非常にうまく機能しますが、これを動的にするにはどうすればよいかわかりません。

コードビハインドから「DoubleAnimation」の「To」パラメーターに変数をバインドしようとしても機能せず、黙って無視されます。

ビューを表すUserControlsを作成しているため、x:Nameプロパティを持つ要素は自動生成されません。

自動生成されたコードで何が起こるかを模倣する以下のコードを使用してこれを回避しようとしました(レイアウトが実際にロードされた後にのみ実行されるという追加のボーナスがあります):

public DoubleAnimation PanelOpenMaxHeightDoubleAnimation;

private void LayoutRoot_Loaded(object sender, System.Windows.RoutedEventArgs e)

{

    var LayoutRootreference = sender as Grid;

    PanelOpenMaxHeightDoubleAnimation = ((DoubleAnimation)(LayoutRootreference.FindName("PanelOpenMaxHeightDoubleAnimation")));

    PanelOpenMaxHeightDoubleAnimation.To = 383;

}

ただし、FindNameがnullを返すため、Toの値を設定しようとすると、これは機能しなくなります(この特定のアニメーションのx:NameをXAMLで手動で「PanelOpenMaxHeightDoubleAnimation」に設定しています)。FindNameがVisualStatesからDoubleAnimationsを取得できず、実際のレイアウトの子のみを取得できないという疑惑が潜んでいます。

XAML Namescopesに関するドキュメントをhttp://msdn.microsoft.com/en-us/library/cc189026(v=VS.95).aspx#UserControlsで見つけましたが、これからのオプションが何であるかを実際には理解していませんでした。段落(非常に限定されていることを除く):

UserControlの場合、定義XAML内のUserControlの部分に相当するテンプレート部分属性規則はなく、テンプレートはまったく適用されません。それでも、定義ネームスコープは定義されており、UserControlをアセンブリにパッケージ化して再利用するときに効果的に封印されるため、定義と使用法の間のネームスコープは切断されたままになります。ここでのベストプラクティスは、定義XAMLを変更するために設定する必要のある値がUserControlのパブリックプロパティとしても公開されるように、UserControlを定義することです。

最後の文とはどういう意味ですか?

次に何ができるのだろうか?コードから状態全体を生成する必要がありますか?

4

1 に答える 1

0

さて、なんとかうまくいったので、私は解決策を共有しています。

リソースでDoubleAnimationへの参照を取得しようとする代わりに、アニメーション化するレイアウトでグリッドに名前を付け、元の質問のコードを使用してグリッドへの参照を取得します。

var SlidePanel = ((Grid)(LayoutRootreference.FindName("SlidePanel")));

これは要素を返し、それを使用して、DoubleAnimationとStoryboardを純粋にコードで最初から作成することが可能です。このコード例を出発点として使用しました:http://msdn.microsoft.com/en-us/library/cc189069 (VS.95).aspx#procedural_code

最良の部分は、ストーリーボードですべてを設定した後でもDoubleAnimation.Toパラメーターを変更できるため、Storyboard.Begin()を呼び出す前に、毎回計算値にリセットするだけです。

これらすべてを手動で設定するのは少し面倒ですが、少なくとも一度設定するとうまく機能します。

于 2010-11-18T12:15:38.560 に答える