2010-11-20 29 views
3

list of sources for dependency property valuesでは、相対優先順位とともに、ローカル値がベース値を決定するために最も優先されます。
ローカル値の直後にテンプレート化された親からのテンプレートプロパティがあります。テンプレートのコンテキストで作成されたコントロールの親ControlTemplate。WPF依存プロパティの優先順位 - テンプレート化された親

私の質問は - ローカルの値がテンプレートプロパティよりも優先されるため、テンプレートで作成されたコントロールの明示的に設定されたプロパティ値(ローカル値)が、そのテンプレートのプロパティトリガー?これはルールが示唆しているように思われますが、コントロールテンプレートでトリガーを使用して設定されたプロパティは、テンプレートに設定されたローカル値をオーバーライドする(つまり優先度が高い)ようです。

優先順位リストの「ローカル値」は、テンプレートで作成されていないコントロールでのみ設定された値を参照しているため、ローカル値とプロパティ値の間の優先順位を実際に比較することはできません。テンプレートの親ですか?

答えて

4

はい、優先順位リストの「ローカル値」はテンプレート外の要素に設定されたプロパティのみを参照します。優先順位リストの関連する部分は、4b:

4. TemplatedParentテンプレートプロパティです。テンプレートの 部分(ControlTemplate またはDataTemplate)として作成された要素は、 TemplatedParentを持ちます。 の適用の詳細については、このトピックの後半のTemplatedParent を参照してください。 テンプレート内では、次の優先度が が適用されます。

a。 TemplatedParent テンプレートからトリガーします。

b。 TemplatedParentテンプレートのプロパティセット(通常は XAML属性を使用)。

テンプレート内で設定されたプロパティ値は、テンプレート内のトリガーよりも低い優先順位であり、両方ともローカル値より低い優先順位です。

DependencyPropertyHelper.GetValueSourceを呼び出してBaseValueSourceプロパティをチェックすると、値の設定方法がわかります。テンプレートの外に設定された値は "Local"のソースを持ち、一方、テンプレート内の値は "ParentTemplate"のソースを持ちます。

別々のソースとしてそれらを持つことは、プロパティシステムがローカル値と親テンプレート値を別々に追跡できることを意味します。テンプレートの値を持ち、後でClearValueを呼び出すプロパティにローカル値を設定すると、テンプレートによって設定された値に戻ります。


次に、テンプレートの値を上書きするローカル値を示す例を示します。下のコードでUserControlを作成し、それをウィンドウに追加します。マウスがコントロール上のどこにいても緑色に変わる青い四角形があります。 「設定」をクリックすると、コードは長方形上に両方の値をオーバーライドするローカル値を設定します。 [クリア]をクリックすると、ローカル値がクリアされ、テンプレートから値が復元されます。 「表示」をクリックすると、現在の値のソースが表示されます(ボタンの上にマウスを置くと、トリガーをオフにするため、キーボードでボタンを押してParentTemplateを表示する必要があります)。

XAML:

<UserControl 
    x:Class="WpfApplication1.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Template> 
     <ControlTemplate> 
      <StackPanel Background="Transparent"> 
       <Button Click="Display_Click" Content="Display"/> 
       <Button Click="Set_Click" Content="Set"/> 
       <Button Click="Clear_Click" Content="Clear"/> 
       <Rectangle Width="100" Height="100" 
          Fill="Blue" Name="PART_Rectangle"/> 
      </StackPanel> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="PART_Rectangle" 
          Property="Fill" Value="Green"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </UserControl.Template> 
</UserControl> 

コードビハインド:答えを

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     rectangle = Template.FindName("PART_Rectangle", this) as Rectangle; 
    } 

    private Rectangle rectangle; 

    private void Display_Click(object sender, RoutedEventArgs e) 
    { 
     var source = DependencyPropertyHelper.GetValueSource(
      rectangle, Rectangle.FillProperty); 
     MessageBox.Show(string.Format("Value {0}; Source {1}", 
      rectangle.Fill, source.BaseValueSource)); 
    } 

    private void Set_Click(object sender, RoutedEventArgs e) 
    { 
     rectangle.Fill = Brushes.Red; 
    } 

    private void Clear_Click(object sender, RoutedEventArgs e) 
    { 
     rectangle.ClearValue(Rectangle.FillProperty); 
    } 
} 
+0

感謝。 "どちらもローカル値よりも優先順位が低い" - いくつかの例をあげてもう少し詳しく説明する必要がありますが、これまでに試したことのあるすべてから、テンプレートのプロパティトリガで設定された値がオーバーライドしているようですテンプレート外の要素のローカル値。私。 4aまたは4b(テンプレートプロパティ)が3(ローカル値)よりも優先順位が低いシナリオを再現できないようです。テンプレートのプロパティ値は、常にローカル値を上書きします。 –

+0

@Sean:ローカル値の優先順位を上げる簡単な例を私の答えに追加しました。 – Quartermeister

+0

ありがとうございます - あなたの例では、3つの間の優先順位を見やすくなります。最初の青の色はParentTemplateのソースを持ち、トリガーによって変更するとParentTemplateTriggerになり、コード経由で設定するとLocalになります。 –

関連する問題