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

代码隐藏:

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

有人可以告诉我问题出在哪里可以?

谢谢

回答

2

的用户控件使得它的内容的“根”元素,这是用来定位VisualStateGroups。如果您使用反射,并期待在UserControl.StateGroupsRoot,你会看到它的样子:

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

尽管FrameworkElement的(因而大多数其他元素)使用方法:

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

当设置Template属性, Content属性仍然为空。当您将画布移到资源下方时,您正在设置Content属性。所以在这种情况下可以找到视觉状态组。

您可以通过直接更改来自ContentControl的控件派生并绕过UserControl来解决此问题。只需在您的XAML和代码隐藏中将UserControl引用更改为ContentControl。

相关问题