2010-04-22 5 views
0

저는 WPF를 처음 접했고 사용자 정의 목록 상자 항목 위에 마우스를 올린 후이 오류가 발생합니다.WPF 템플릿을 처리하는 동안 참조에 무한 루프가 있습니다.

오류 : 형식이 ''System.Windows.Controls.TextBox '인 요소에 대해 템플릿을 처리하는 동안 참조에서 무한 루프가 발견되었습니다. 나는 무엇을 놓치고

private void ListItem_MouseOver(object sender, RoutedEventArgs e) 
    { 
     e.Handled = true; 
     FrameworkElement element = e.OriginalSource as FrameworkElement; 
     if (element != null) 
     { 
      while (VisualTreeHelper.GetParent(element) != null) 
      { 
       element = VisualTreeHelper.GetParent(element) as FrameworkElement; 
       TextBox item = element as TextBox; 
       if (item != null) 
       { 
        item.Style = (Style)item.FindResource("MouseOverFocusStyle"); 
        return; 
       } 

      } 
     } 
    } 

다음과 같이

<Window.Resources> 

    <ControlTemplate x:Key="MouseOverFocusTemplate" > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="55*" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
             Foreground="#FF6FB8FD" 
             FontSize="24" 
             TextWrapping="Wrap" 
             Text="{Binding .}" 
             Grid.Column="1" 
             Grid.Row="1" 
             MinHeight="55" 
             Cursor="Hand" 
             IsReadOnly="True" 
             FontFamily="Arial" 
             > 
       <TextBox.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FF013B73" Offset="0.501"/> 
         <GradientStop Color="#FF091F34"/> 
         <GradientStop Color="#FF014A8F" Offset="0.5"/> 
         <GradientStop Color="#FF003363" Offset="1"/> 
        </LinearGradientBrush> 
       </TextBox.Background> 

      </TextBox> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="MouseOverFocusStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="Template" Value="{StaticResource MouseOverFocusTemplate}"/> 
    </Style> 


    <ControlTemplate x:Key="LostFocusTemplate" > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="55*" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
             Foreground="#FF6FB8FD" 
             FontSize="24" 
             TextWrapping="Wrap" 
             Text="{Binding .}" 
             Grid.Column="1" 
             Grid.Row="1" 
             MinHeight="55" 
             Cursor="Hand" 
             IsReadOnly="True" 
             FontFamily="Arial" 
             > 
       <TextBox.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <LinearGradientBrush.RelativeTransform> 
          <TransformGroup> 
           <ScaleTransform CenterX="0.5" CenterY="0.5"/> 
           <SkewTransform CenterX="0.5" CenterY="0.5"/> 
           <RotateTransform CenterX="0.5" CenterY="0.5"/> 
           <TranslateTransform/> 
          </TransformGroup> 
         </LinearGradientBrush.RelativeTransform> 
         <GradientStop Color="#FF091F34" Offset="1"/> 
         <GradientStop Color="#FF002F5C" Offset="0.4"/> 
        </LinearGradientBrush> 
       </TextBox.Background> 

      </TextBox> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="LostFocusStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="Template" Value="{StaticResource LostFocusTemplate}"/> 
    </Style> 

    <ControlTemplate x:Key="GotFocusTemplate" > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="55*" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
       <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
             Foreground="#FFE38E27" 
             FontSize="24" 
             TextWrapping="Wrap" 
             Text="{Binding .}" 
             Grid.Column="1" 
             Grid.Row="1" 
             MinHeight="55" 
             Cursor="Hand" 
             IsReadOnly="True" 
             FontFamily="Arial" 
             > 
        <TextBox.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="Black" Offset="0.501"/> 
         <GradientStop Color="#FF091F34"/> 
         <GradientStop Color="#FF002F5C" Offset="0.5"/> 
        </LinearGradientBrush> 
       </TextBox.Background> 

       </TextBox> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="GotFocusStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="Template" Value="{StaticResource GotFocusTemplate}"/> 
    </Style> 

    <Style TargetType="ListBoxItem"> 
     <EventSetter Event="GotFocus" Handler="ListItem_GotFocus"></EventSetter> 
     <EventSetter Event="LostFocus" Handler="ListItem_LostFocus"></EventSetter> 
     <EventSetter Event="Mouse.MouseMove" Handler="ListItem_MouseOver"></EventSetter> 
    </Style> 

    <DataTemplate DataType="{x:Type TextBlock}"> 
    </DataTemplate> 

    <DataTemplate x:Key="CustomListData" DataType="{x:Type ListBoxItem}"> 
     <Border BorderBrush="Black" BorderThickness="1" Margin="-2,0,0,-1"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="55*" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RenderTransform> 
        <TransformGroup> 
         <ScaleTransform ScaleX="1" ScaleY="1"/> 
         <SkewTransform AngleX="0" AngleY="0"/> 
         <RotateTransform Angle="0"/> 
         <TranslateTransform X="0" Y="0"/> 
        </TransformGroup> 
       </Grid.RenderTransform> 
       <!--<ScrollViewer x:Name="PART_ContentHost" />--> 
       <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
             Foreground="#FF6FB8FD" 
             FontSize="24" 
             FocusVisualStyle="{StaticResource GotFocusStyle}" 
             TextWrapping="Wrap" 
             Text="{Binding .}" 
             Grid.Column="1" 
             Grid.Row="1" 
             MinHeight="55" 
             Cursor="Hand" 
             IsReadOnly="True" 
             FontFamily="Arial" 
             > 
        <TextBox.Background> 
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
          <LinearGradientBrush.RelativeTransform> 
           <TransformGroup> 
            <ScaleTransform CenterX="0.5" CenterY="0.5"/> 
            <SkewTransform CenterX="0.5" CenterY="0.5"/> 
            <RotateTransform CenterX="0.5" CenterY="0.5"/> 
            <TranslateTransform/> 
           </TransformGroup> 
          </LinearGradientBrush.RelativeTransform> 
          <GradientStop Color="#FF091F34" Offset="1"/> 
          <GradientStop Color="#FF002F5C" Offset="0.4"/> 
         </LinearGradientBrush> 
        </TextBox.Background> 

       </TextBox> 
      </Grid> 
     </Border> 
    </DataTemplate> 

    <Style TargetType="{x:Type ListBox}"> 
     <Setter Property="ItemTemplate" Value="{StaticResource CustomListData }" /> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
    </Style> 

</Window.Resources> 

<Window.DataContext> 
<ObjectDataProvider 
    ObjectType="{x:Type local:ImageLoader}" 
    MethodName="LoadImages" 
    /> 
    </Window.DataContext> 

    <ListBox ItemsSource="{Binding}" Width="320" Background="#FF021422" BorderBrush="#FF1C4B79"> 

     <ListBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</SolidColorBrush> 
    </ListBox.Resources> 

    </ListBox> 

이벤트를 통해 마우스 뒤에 코드는? 이 작업을 수행하는 더 쉬운 방법이 있습니까? 사전에

덕분에 라이언

답변

1

나는, 컨트롤 템플릿 지원 이벤트 (라고 트리거) http://msdn.microsoft.com/en-us/library/ms750821%28VS.85%29.aspx

업데이트를 참조하십시오이 어려운 방법 일을하려고한다고 생각 : 좋아, 내가 어떤 문제를 참조 생각 TextBox 유형에 대한 스타일을 정의한 다음 TextBox를 스타일에 배치합니다. 당신은 여전히 ​​내가 텍스트 상자의 사용자 지정 목록 상자를 가지고 있기 때문에이 작업을 생각 해달라고 트리거

<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBoxBase}"> 
<Setter Property="SnapsToDevicePixels" Value="True"/> 
<Setter Property="OverridesDefaultStyle" Value="True"/> 
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/> 
<Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
<Setter Property="AllowDrop" Value="true"/> 
<Setter Property="Margin" Value="2" /> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
     <Border 
     Name="Border" 
     CornerRadius="2" 
     Padding="2" 
     Background="{DynamicResource TextBoxBackBrush}" 
     BorderBrush="{StaticResource SolidBorderBrush}" 
     BorderThickness="1" > 
     <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> 
     </Border> 
     <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush}"/> 
      <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBackgroundBrush}"/> 
      <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 

+0

를 사용하여 하나에 모든 스타일을 결합 할 수 있어야한다. – Ryan

+0

TextBox.Background 만 변경하는 스타일은 어떻게 만들 수 있습니까? 내가 이것을 알아낼 수 있었던 유일한 방법은 스타일에 아주 새로운 텍스트 상자를 추가하는 것이 었습니다. – Ryan

+0

Nevermind, LinearGradientBrush를 만들고 그 부분을 작동 시켰습니다. – Ryan

관련 문제