我已經嘗試了幾種不同的解決方案,但不能滿足我所有的需求。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>
嘗試3
我感動我的畫布/文本框的DataTemplate以外,並創建一個網格,把它放在上面橢圓列表框。這從佈局的角度來看是有效的,但是在檢查鼠標懸停並將文本框居中在活動/懸停的控件上時造成了很大的混亂。
因此,這讓我沒有按我想要的方式工作的實現。任何人有任何建議?
是的,你會認爲這會起作用,但事實並非如此。我已經嘗試在所有內容上添加ClipToBounds = False,但它無濟於事。 – JKoplo
在數據模板中發佈'Grid'的XAML中,名爲'PopupCanvas'的'Canvas'沒有ClipToBounds屬性集。另外我知道它與問題無關,但我注意到'TextBox'具有'Visibility = Collapsed'。另一件我想嘗試的是使用'Canvas'來放置'TextBox',我將使用'Grid'的'ColumDefinitions'和'RowDefinition'來排列模板。 – Agustin0987
我認爲這個問題可能是'Grid'和/或'Canvas'的'ClipToBound'屬性,因爲你給Grid定了一個'Width'。試試看。這個問題可能是因爲文本很大以適應'Width'的'Grid' 40,因此被裁剪。 – Agustin0987