1

Windows Phone SL アプリケーションのビジュアル ツリーの次の部分を検討してください。

コンテンツ プレゼンター

ご覧のとおり、PanoramaItem テンプレートには static への参照が含まれていますDataTemplateSelector。これは、提供された Key に基づいてデータ テンプレートを動的にフィードし、 に提供されたさまざまなビュー モデルのさまざまなビューを表示する単純なクラスDataContextですPanoramaItem。そのコードは次のとおりです。

public static T FindResource<T>(this DependencyObject initial, string key) where T : DependencyObject
        {
            DependencyObject current = initial;

            while (current != null)
            {
                if (current is FrameworkElement)
                {
                    if ((current as FrameworkElement).Resources.Contains(key))
                    {
                        return (T)(current as FrameworkElement).Resources[key];
                    }
                }

                current = VisualTreeHelper.GetParent(current);
            }

            if (Application.Current.Resources.Contains(key))
            {
                return (T)Application.Current.Resources[key];
            }

            return default(T);
        }
    }

    public class DataTemplateSelector : ContentControl
    {
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            ContentTemplate = this.FindResource<DataTemplate>(newContent.GetType().FullName);
        }
    }

問題は、ContentPresenter上の画像で選択されているのを見ることができるの作成を制御できないことです。一貫したレイアウトを得るには、垂直方向の配置プロパティを設定できる必要があります。this を参照できないため、どうすればよいかわかりませんContentPresenter。ContentPresenter のプロパティを設定するにはどうすればよいですか?

4

2 に答える 2

0

解決策も簡単でした:

ContentControl 派生クラスのスタイルを定義します。

<Style TargetType="support:DataTemplateSelector">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="support:DataTemplateSelector">
                        <ContentPresenter
                        ContentTemplate="{TemplateBinding support:DataTemplateSelector.ContentTemplate}"
                        Content="{TemplateBinding support:DataTemplateSelector.Content}" 
                        VerticalAlignment="Top"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

UserControl.Resourcesビューの XAML のセクションで私のものを定義しました。

クラスのコンストラクターでコードの「スタイル変更」行を呼び出します。

 public class DataTemplateSelector : ContentControl
    {
        public DataTemplateSelector()
        {
            this.DefaultStyleKey = typeof (DataTemplateSelector);
        } 

これが、の派生コントロールのContentPresenter要素の外観を制御する方法です。ContentControl

于 2011-11-12T15:24:04.247 に答える
0

あなたはすでに答えを目の前に置いているようです。

を使用しVisualTreeHelper.GetParentて の直接の視覚的な親をDataTemplateSelectorとして取得し、FrameworkElementそのVerticalAlignmentプロパティを変更します。

ところで:-

            if (current is FrameworkElement) 
            { 
                if ((current as FrameworkElement).Resources.Contains(key)) 
                { 
                    return (T)(current as FrameworkElement).Resources[key]; 
                } 
            } 

に減らすことができます:-

            var currentFE = current As FrameworkElement;
            if (currentFE != null && currentFE.Contains(key) )
            {
                return (T)currentFE.Resource[key];
            }

キャストの試みは潜在的に 3 回ではなく 1 回のみであり、より短く、理解しやすくなっています。変数を追加することが有益である例(通常、コード内の変数の数を減らそうとする場合があります)。

于 2011-11-12T14:09:28.733 に答える