2012-04-07 2 views
4

짧은 이야기 : ListBox에 여러 차트를 표시하는 창이 있습니다. mouseOver 차트의 경우 (LineSeries 사용) dataPoints를 따르는 선이 있습니다 (dataPoint 위치에 스냅). 그 라인 근처에서 나는 그 dataPoints에 관한 정보를 보여주는 팝업에서 만들어진 툴팁을 보여줄 것입니다.WPF "툴팁"팝업 깜박임

"tooltip" as it appears

지금까지 너무 좋아. 문제는 마우스를 툴팁 위로 이동하려고 할 때 팝업이 깜박 거리기 시작하는 것입니다 (예 : 열기/닫기 루프). 이미 팝업창과 어린이들에게 설정했습니다 IsHitTestVisible="False".

"tooltip" repositioned

을 ...하지만 거의 "이해할 수"입니다 : 임시 솔루션 팝업으로

여기처럼 커서의 길에서 "간다".

이제 질문이 생깁니다. 무엇이 잘못 되었습니까? 마우스가 위에있을 때 팝업이 깜박 거리는 이유는 무엇입니까?

모든 의견 환영

PS. XAML 도구 팁 (코드로 생성되었지만 여기에 있습니다.) :

차트의 datacontext는 클래스에 바인딩 된 데이터이고 일부 차트 이벤트는 icommands를 통해 구현됩니다. 팝업은 팝업의 아이가 작성되는 MouseMoveCommand에 ..., 그 클래스의 생성자에서

ppchart = New Popup() With {.AllowsTransparency = True, .IsHitTestVisible = False,.StaysOpen = True} 

을 만들어 :

Dim ppCont As XElement = <Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" IsHitTestVisible="False" VerticalAlignment="Top"> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition Height="Auto"/> 
            </Grid.RowDefinitions> 
            <Rectangle Opacity="0.5" Grid.RowSpan="2" IsHitTestVisible="False" StrokeThickness="0" RadiusX="2" RadiusY="2" Fill="#FFBABABA"/> 
            <TextBlock Text="{Binding Over, StringFormat=HH:mm}" FontSize="9" TextAlignment="Center" FontFamily="Segoe UI" IsHitTestVisible="False" Margin="1"/> 
            <ListBox x:Name="listBox" ItemsSource="{Binding Points}" Background="{x:Null}" BorderBrush="{x:Null}" FontSize="8" Margin="1,0,1,1" Grid.Row="1" IsHitTestVisible="False" IsTextSearchEnabled="False" HorizontalAlignment="Stretch"> 
             <ListBox.ItemContainerStyle> 
              <Style TargetType="{x:Type ListBoxItem}"> 
               <Setter Property="Background" Value="Transparent"/> 
               <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
               <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
               <Setter Property="Padding" Value="0"/> 
               <Setter Property="IsHitTestVisible" Value="False"/> 
              </Style> 
             </ListBox.ItemContainerStyle> 
             <ListBox.ItemTemplate> 
              <DataTemplate> 
               <Grid IsHitTestVisible="False"> 
                <Grid.ColumnDefinitions> 
                 <ColumnDefinition Width="Auto"/> 
                 <ColumnDefinition Width="Auto"/> 
                 <ColumnDefinition Width="Auto"/> 
                </Grid.ColumnDefinitions> 
                <Rectangle Fill="{Binding Culoare}" Width="3" HorizontalAlignment="Left" Margin="1" IsHitTestVisible="False"/> 
                <TextBlock Text="{Binding Operation}" HorizontalAlignment="Stretch" IsHitTestVisible="False" Grid.ColumnSpan="1" Grid.Column="1"/> 
                <TextBlock Text="{Binding points.Value}" HorizontalAlignment="Stretch" Grid.Column="2" TextAlignment="Right" IsHitTestVisible="False"/> 
               </Grid> 
              </DataTemplate> 
             </ListBox.ItemTemplate> 
            </ListBox> 
           </Grid> 

     ppchart.Effect = New Effects.DropShadowEffect() With {.Opacity = 0.5, .BlurRadius = 5, .Direction = 80, .Color = Colors.Black} 
     ppchart.Child = CType(XamlReader.Load(New XmlTextReader(New StringReader(ppCont.ToString))), UIElement) 

는 재 편집 : 이것은

enter image description here 같은 모습입니다

+0

툴팁에 사용 된 XAML을 게시 할 수 있습니까? – Dennis

+0

왜 IsHitTestVisible을 설정하고 있습니까? 너는 그것없이 시도 했니? –

+0

처음으로 설정하지 않고 시도했지만 깜박 거 렸습니다. –

답변

0

의견을 읽은 후에 나는 잘못된 이벤트를 사용하고 있다고 생각합니다. MouseMove 이벤트가 계속 발생하고 팝업이 표시/숨기기 또는 깜박일 때마다 표시됩니다.

MouseEnterMouseLeave 이벤트를 사용하고 싶습니다.

+0

나는 이미 시도했지만, 데이터 포인트 값이 마우스가 바뀌 었는지 확인해야합니다. (데이터 연결점의'MouseEnter' 또는'MouseLeave'에 연결한다고 말할 것입니다 만,'LineSeries'이되어서 datapoints의 너비/높이를 0으로 설정 했으므로, 그냥 줄이 필요했습니다. 어쨌든'MouseMove ''다시 열기 '전에 팝업 값이 다른지 확인합니다 ... –

+0

재미있는 점입니다. 마우스가 툴팁 위에있을 때''Popup.IsOpen = "False"'를 설정 한'ChartMouseLeave'는 트리거 된 ... –

+0

어떤 차트 미들웨어를 사용하고 있습니까? – Dennis

2

또한 MouseEnterMouseLeave 이벤트를 사용하는 동안 비슷한 문제가 발생했습니다. WPF에서 MouseEnter 이벤트의 이상한 동작이 있습니다. 버그인지 모릅니다. 상단에서 고려하여 항목을 입력하면 깜박임이 발생합니다. 다른 방향에서 항목을 입력하면 부드러운 팝업이 나타납니다.

AllowsTransparency = True 

부분 : 그래서 그것을 방지하기 위해, 나는를 제거했습니다.

편집 :

내 요구에 완벽한 동작을 찾을 수 없습니다 여전히 동안, 나는 내가 아니었다 그러나 스콧 Hanselman은 here

에 의해 설명 된 바와 같이이 실제로 버그가 아닙니다 것을 알아 냈 문제를 내 문제와 비교하고 해결할 수 있습니다.어쨌든 애니메이션 기능을 사용하기 위해 마우스의 현재 위치를 확인하여 Popup 컨트롤을 추가적으로 열거 나 닫지 않도록하는 솔루션을 찾았습니다. MouseLeave 이벤트 또는 처리기에서

ListViewItem listViewItem = e.Source as ListViewItem;   
     if(currPoint!=e.GetPosition(listViewItem)) 
      compToStrategyVM.OpenPopup(listViewItem, listViewPopup); 

마찬가지로 : 여기

ListViewItem listViewItem = e.Source as ListViewItem; 
     if (currPoint != e.GetPosition(listViewItem)) 
      compToStrategyVM.ClosePopup(listViewPopup); 

compToStrategyVM 내 뷰 모드와 listViewPopup을 의미 나는 변수

Point currPoint = new Point(); 

그리고 다음 MouseEnter 이벤트 또는 핸들러

정의 Popup 컨트롤의 이름입니다. 문제는 여전히 지속되지만이 방법으로 깜박임 효과가 상당 부분 줄어 들었습니다.

+0

팝업 애니메이션을 사용할 수 없다는 단점 만 있습니다. 위의 변수를 'true'로 설정해야하는 기능 – sm2mafaz