1

나는 완전히 잃어 버렸습니다. 정말 감사드립니다.GoToState가 UserControl의 ControlTemplate에 대해 작동하지 않습니다.

최종 목표는 두 개의 컨트롤 템플릿을 포함 할 사용자 정의 컨트롤을 만드는 것입니다. 광장과 원입니다. 유형에 따라 컨트롤에 다른 하나가 표시됩니다. 마우스가 모양에 들어가면 불투명도가 0.2로 변경됩니다.

첫 번째 부분은 작동하지만 불투명도는 변경되지 않습니다. 이벤트가 트리거되고 GoToState가 호출되지만 결과는 없습니다. 불투명도는

1. 유지 나의 XAML :

<UserControl.Resources> 

    <ControlTemplate x:Key="TemplateSquare" TargetType="{x:Type local:KeyControl}"> 

     <Canvas x:Name="MainCanvas" VerticalAlignment="Center" HorizontalAlignment="Center"> 

      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CommonStates"> 
        <VisualState x:Name="Normal" /> 
        <VisualState x:Name="MouseOver"> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetName="CenterRectangle" Storyboard.TargetProperty="(UIElement.Opacity)" Duration="0" To=".2"/> 
         </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 

      <Rectangle x:Name="CenterRectangle" Fill="Red" Width="100" Height="100"></Rectangle> 

     </Canvas> 

    </ControlTemplate>  
</UserControl.Resources> 
<!-- IF I MOVE THE CANVAS HERE THE OPACITY CHANGES ON MOUSE OVER --> 

이 Codebehind가 : 문제가 될 수있는 곳

public partial class KeyControl : UserControl 
{ 
    private bool _isPressed = false; 
    private bool _isMouseOver = false; 

    public KeyControl() 
    { 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(KeyControl_Loaded); 
    } 


    private void KeyControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     //this will be set in the Type setter 
     this.Template = this.FindResource("TemplateSquare") as ControlTemplate; 

     this.MouseEnter += new MouseEventHandler(CorePart_MouseEnter); 
     this.MouseLeave += new MouseEventHandler(CorePart_MouseLeave); 

     GoToState(false); 
    } 

    private void GoToState(bool useTransitions) 
    { 
     if (_isPressed) 
      VisualStateManager.GoToState(this, "Pressed", useTransitions); 
     else if (_isMouseOver) 
      VisualStateManager.GoToState(this, "MouseOver", useTransitions); 
     else 
      VisualStateManager.GoToState(this, "Normal", useTransitions); 
    } 

    private void CorePart_MouseLeave(object sender, MouseEventArgs e) 
    { 
     _isMouseOver = false; 
     GoToState(true); 
    } 

    private void CorePart_MouseEnter(object sender, MouseEventArgs e) 
    { 
     _isMouseOver = true; 
     GoToState(true); 
    } 
} 

누군가가 말해 주시겠습니까?

은의 UserControl는 VisualStateGroups을 찾는 데 사용됩니다 "루트"요소 콘텐츠의 수 당신에게

답변

2

감사드립니다. FrameworkElement (따라서 대부분의 다른 요소)를 사용하는 동안

internal override FrameworkElement StateGroupsRoot { 
    get { 
     return (base.Content as FrameworkElement); 
    } 
} 

:

internal virtual FrameworkElement StateGroupsRoot { 
    get { 
     return (this._templateChild as FrameworkElement); 
    } 
} 

을 템플릿 속성을 설정하면 반사경을 사용하고 UserControl.StateGroupsRoot 보면, 당신은 보이는 볼 것 Content 속성은 여전히 ​​null입니다. 캔버스를 리소스 아래로 이동하면 Content 속성을 설정하게됩니다. 이 경우 시각적 상태 그룹을 찾을 수 있습니다.

ContentControl에서 직접 파생 된 컨트롤을 변경하고 UserControl을 우회하여이 문제를 해결할 수 있습니다. ContentControl에 대한 UserControl 참조를 XAML 및 코드 숨김에서 변경하면됩니다.