2010-12-16 43 views
1

我想了解如何將作爲ControlTemplate一部分的對象的不透明度綁定到屬於另一個ControlTemplate一部分的對象。 我試過這個,但它沒有做任何事情。如何基於另一個ControlTemplate中對象的不透明度來綁定不透明度值?

Image x:Name="PART_IconHover" Source="{Binding IconHover}" Opacity="{Binding Opacity, ElementName=border, Mode=OneWay}" /> 

下面是二CONTROLTEMPLATES的代碼:

<Setter Property="Template"> 
<Setter.Value> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <Border x:Name="border" BorderBrush="#FF6E6E6E" BorderThickness="0.5" Opacity="0" Background="#00000000"> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CommonStates"> 
        <VisualState x:Name="Normal"/> 
        <VisualState x:Name="MouseOver"> 
         <Storyboard> 
          <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="border"> 
           <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
          </DoubleAnimationUsingKeyFrames> 
                   </Storyboard> 
        </VisualState> 
        <VisualState x:Name="Pressed"/> 
        <VisualState x:Name="Disabled"/> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsKeyboardFocused" Value="true"/> 
      <Trigger Property="ToggleButton.IsChecked" Value="true"/> 
      <Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="Foreground" Value="#ADADAD"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Setter.Value> 

我想的不透明度在控件模板圖像結合下面

<ControlTemplate x:Key="ThumbnailContainerTemplate" TargetType="{x:Type ContentControl}"> 
    <Border x:Name="PART_Border" BorderThickness="1" BorderBrush="#FFd9d9d9" Opacity="0" /> 
    <Grid Margin="10"> 
      <Image x:Name="PART_IconHover" Source="{Binding IconHover}" Opacity="{Binding Opacity, ElementName=border, Mode=OneWay}" /> 
    </Grid> 

任何ID eas非常感謝。先謝謝你!

回答

1

正如mdm20說,由於模板只是用來建立一個控制,你不能綁定到元素中的模板與模板之外。例如,幾個按鈕可以在您的示例中使用模板,以便ContentControl綁定到哪個Button?

我看不到一個可重複使用的解決方案,這一點,但我想到的一件事是在代碼中設置綁定一度落後控件加載完成這樣

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    Border border = myButton.Template.FindName("border", myButton) as Border; 
    Image PART_IconHover = contentControl.Template.FindName("PART_IconHover", contentControl) as Image; 

    Binding opacityBinding = new Binding("Opacity"); 
    opacityBinding.Mode = BindingMode.OneWay; 
    opacityBinding.Source = border; 
    PART_IconHover.SetBinding(Image.OpacityProperty, opacityBinding); 
} 

更新
兩個控件綁定到Button模板中的邊框。該綁定是在Control_Loaded事件處理程序中進行的。

<ContentControl ... 
       Loaded="Control_Loaded"> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Template" Value="{StaticResource contentTemplate}"/> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
<ContentControl ... 
       Loaded="Control_Loaded"> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Template" Value="{StaticResource contentTemplate}"/> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

private void Control_Loaded(object sender, RoutedEventArgs e) 
{ 
    Border border = myButton.Template.FindName("border", myButton) as Border; 
    Control control = sender as Control; 
    Image PART_IconHover = control.Template.FindName("PART_IconHover", control) as Image; 

    Binding opacityBinding = new Binding("Opacity"); 
    opacityBinding.Mode = BindingMode.OneWay; 
    opacityBinding.Source = border; 
    PART_IconHover.SetBinding(Image.OpacityProperty, opacityBinding); 
} 
+0

謝謝你的幫助。這是一個有效的觀點。我會嘗試在我的示例中實現它。如果我能成功,我會讓你知道的。 – vladc77 2010-12-17 20:57:13

+0

@ vladc77:是的,希望它會!我發佈的代碼來自您製作的問題的示例應用程序,它適用於我。這不是一個非常動態的解決方案,但如果你只是需要在一個或兩個地方,那應該不是一個問題:) – 2010-12-17 21:51:42

+0

我需要在動態創建的控件上有這種行爲。我唯一擔心的是它是否會改變運行時創建的其他控件的不透明度。 – vladc77 2010-12-18 00:21:26

2

我不認爲你可以綁定到像這樣的模板內的元素。綁定系統無法找到它們。

如果你只需要在你的XAML某處一個數值,你想要的一切使用,只需將它添加一個這樣的:

<sys:Double x:Key="Opacity">.5</sys:Double> 

然後就擁有了一切都綁定到。你將需要添加SYS命名空間

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
+0

謝謝你的期待。當MouseOver發生在第一個ControlTemplate上時,我需要更改第二個Controltemplate內部圖像的不透明度。在MouseOver上,第一個ControlTemplate中的故事板開始運行。我不知道我是否可以用您提供的解決方案來完成。任何關於正確方法的想法?謝謝。 – vladc77 2010-12-16 21:29:52