2010-12-16 4 views
1

다른 ControlTemplate의 일부인 개체에 ControlTemplate의 일부인 개체의 불투명도를 바인딩하는 방법을 알려드립니다. 나는 이것을 시도했지만 아무 것도하지 않았다.다른 ControlTemplate에서 개체의 불투명도에 따라 불투명도 값을 바인딩하는 방법?

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

아래의 ControlTemplate의 이미지 불투명도를 바인딩 할 : 다음은

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

두 ControlTemplates의 코드 모든 이드 eas 매우 감사합니다. 미리 감사드립니다.

답변

1

를 추가해야합니다. 예를 들어, 여러 Button이 예제에서 Template을 사용할 수 있으므로 Button에서 ContentControl을 바인딩 할 수 있습니까? 컨트롤이 완료되면

내가 마음에 오는 한 가지 있지만, 이것에 재사용 가능한 솔루션을 볼 수 없습니다

은 뒤에 코드에서 바인딩을 설정하는 것입니다이

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

+0

@ vladc77 : 네, 잘하면 그럴 것입니다! 내가 게시 한 코드는 내가 작성한 문제의 샘플 앱에서 나왔고 저에게 효과적이었습니다. 그것은 매우 역동적 인 해결책이 아니지만 만약 당신이 단지 한두 장소에서 이것을 필요로한다면 그것은 문제가 될 것입니다. :) –

+0

동적으로 생성 된 컨트롤에서이 동작이 필요합니다. 내 걱정은 런타임에 생성 된 다른 컨트롤의 불투명도가 변경되는 경우입니다. – vladc77

2

그런 템플릿 안의 요소에 바인딩 할 수 있다고 생각하지 않습니다. 바인딩 시스템에서 해당 바인딩 시스템을 찾을 수 없습니다. 당신은 당신이 모든 것을 사용하려는 XAML에서 어딘가에 숫자 값을해야하는 경우

, 당신은이 같은 하나를 추가 할 수 있습니다

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

그런 다음 단지에 이르기까지 모든 바인딩이있다. 당신은 템플릿이 단지 제어를 구축하는 데 사용되기 때문에 템플릿 외부에서 템플릿 내부 요소에 바인딩 할 수 없습니다, mdm20 말했듯이 체계적으로 줄여 나가게 네임 스페이스를

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

감사합니다. 첫 번째 ControlTemplate을 통해 MouseOver가 발생하면 두 번째 ControlTemplate 내부에서 이미지의 불투명도를 변경해야합니다. MouseOver에서 첫 번째 ControlTemplate 내의 스토리 보드가 실행되도록 시작됩니다. 내가 제공 한 솔루션으로 해결할 수 있을지 확실하지 않습니다. 올바른 방법에 대한 아이디어가 있습니까? 고맙습니다. – vladc77

관련 문제