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を定義することです。
最後の文とはどういう意味ですか?
次に何ができるのだろうか?コードから状態全体を生成する必要がありますか?