1

考慮了Windows Phone SL應用的視覺樹下面的部分屬性:設置的自動生成的ContentPresenter

Content presenter

正如你所看到的,PanoramaItem模板包含靜態參考DataTemplateSelector。它是一個簡單的類,它根據提供的Key動態提供數據模板,以顯示DataContextPanoramaItem之間的不同視圖。下面是它的代碼:

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無法控制。爲了獲得一致的佈局,我需要能夠設置它的垂直對齊屬性。我似乎不知道我該怎麼做,因爲我不能參考ContentPresenter。我如何設置ContentPresenter的屬性?

回答

0

的解決方案再一次很簡單:在一個視圖的XAML的UserControl.Resources部分

<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> 

我定義我的:

定義樣式我ContentControl中派生類。

調用的代碼在類的構造函數中的「改款」行:

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

這就是你如何控制衍生控制ContentControl的的ContentPresenter元素的外觀。

0

你似乎已經有了坐在你面前的答案。

使用VisualTreeHelper.GetParent可以將DataTemplateSelector的直接視覺父項作爲FrameworkElement,然後修改其VerticalAlignment屬性。

BTW: -

  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]; 
      } 

演員嘗試只發生一次,而不是潛在的三倍,更短,更容易理解。一個例子加上一個變量是有益的(而通常我們可能會嘗試減少我們的代碼中的變量數量)。

+0

謝謝你的提示。儘管我需要設置DataTemplateSelector(簡稱DTS)以下的ContentPresenter的值,但不是它的父級。目標ContentPresenter是從ContentControl派生的所有類的默認元素(DTS派生自ContentControl),我猜可以通過重新定義DataTemplateSelector的默認ControlTemplate來改變。我找到了一個如何在XAML中使用它的例子,但是DTS是一個代碼唯一的控件,在這種情況下我不知道如何解決。 –