2016-09-07 80 views
0

我已經嘗試了幾種不同的解決方案,但不能滿足我所有的需求。WPF列表框項目名稱在鼠標懸停或活動

我們有一個可觀察的對象集合,每個對象都有一個狀態和一個名稱。這是一種運行項目的任務列表。要在WPF中顯示此列表,我們有一些代碼將每個項目表示爲具有某些顏色和動畫的橢圓。

問題是,我們希望在鼠標懸停或任務處於給定狀態時將項目的名稱顯示爲「彈出」。


嘗試#1

我第一次嘗試實現此作爲一個DataTemplate(用作一個ItemTemplate)與實際WPF彈出。我實現了兩個數據觸發器 - 一個用於鼠標懸停,一個用於任務狀態。我根據橢圓定位彈出窗口,一切都很棒。但是,移動窗口或切換到不同的窗口會在所有內容上留下彈出窗口。


嘗試#2

而不是使用彈出窗口的我在畫布上用一個文本框。直到在Listbox中使用Datatemplate之前,這個工作很好。項目主機(stackpanel)結束剪輯字符串。

這裏的示例代碼:

<DataTemplate x:Key="EllipseTemplate"> 
    <Grid Height="40" Width="40"> 
     <Canvas Name="PopupCanvas" HorizontalAlignment="Center" Width="500"> 
      <TextBlock Name="PopupName" 
        Width="{Binding ElementName=PopupCanvas, Path=ActualWidth}" 
        Text="{Binding}" 
        Background="Transparent" 
        FontSize="16" HorizontalAlignment="Center" TextAlignment="Center" FontWeight="Bold" 
        Canvas.Top="-25" 
        Visibility="Collapsed" 
        /> 
     </Canvas> 
     <Ellipse x:Name="Ellipse" Height="25" Width="25" Margin="0" 
       HorizontalAlignment="Center" VerticalAlignment="Center" 
       Fill="Green" 
       RenderTransformOrigin="0.5, 0.5" StrokeThickness="0.5" Stroke="Black"> 
     </Ellipse> 
    </Grid> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource TemplatedParent}}" Value="True"> 
      <Setter TargetName="PopupName" Property="Visibility" Value="Visible" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

<Grid Name="Test" Background="LightGoldenrodYellow" ClipToBounds="False" Margin="50"> 
    <ListBox Name="OverlayTest" 
      Background="CornflowerBlue" 
      BorderThickness="0" 
      VerticalAlignment="Center" 
      Margin="10" 
      ClipToBounds="False" 
      ItemTemplate="{StaticResource EllipseTemplate}"> 
     <sys:String>Very long string that will get clipped</sys:String> 
     <sys:String>Two</sys:String> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" IsItemsHost="True" Margin="10,50,10,50" ClipToBounds="False"/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 
</Grid> 

Example of clipping


嘗試3

我感動我的畫布/文本框的DataTemplate以外,並創建一個網格,把它放在上面橢圓列表框。這從佈局的角度來看是有效的,但是在檢查鼠標懸停並將文本框居中在活動/懸停的控件上時造成了很大的混亂。


因此,這讓我沒有按我想要的方式工作的實現。任何人有任何建議?

回答

0

好的,在這裏我有另一個想法。我以前遇到過ListBox問題。嘗試用ItemsControl替換ListBox

0

嘗試#2聽起來像工作正常。您應該能夠解決使用這些解決方案之一剪裁的問題(或全部):

  1. 集的ListBoxfalse
  2. ClipToBounds屬性設置StackpanelfalseClipToBounds財產
+0

是的,你會認爲這會起作用,但事實並非如此。我已經嘗試在所有內容上添加ClipToBounds = False,但它無濟於事。 – JKoplo

+0

在數據模板中發佈'Grid'的XAML中,名爲'PopupCanvas'的'Canvas'沒有ClipToBounds屬性集。另外我知道它與問題無關,但我注意到'TextBox'具有'Visibility = Collapsed'。另一件我想嘗試的是使用'Canvas'來放置'TextBox',我將使用'Grid'的'ColumDefinitions'和'RowDefinition'來排列模板。 – Agustin0987

+0

我認爲這個問題可能是'Grid'和/或'Canvas'的'ClipToBound'屬性,因爲你給Grid定了一個'Width'。試試看。這個問題可能是因爲文本很大以適應'Width'的'Grid' 40,因此被裁剪。 – Agustin0987