有什麼辦法可以實現像辦公室撤消下拉(圖像波紋管)? 我的意思是,當用戶將鼠標放在第一個以外的項目上時,我想突出顯示上一個項目? 我試圖從FluentRibbon一些控制,但至今沒有運氣..高亮列表框中的多個項目
回答
在大多數情況下,設計這樣的控制在Blend完成。但是,如果您不知道如何使用Blend,您仍然可以通過XAML和代碼隱藏實現類似的結果,但是您必須做更多的工作。
我們從創建一個名爲CustomListBoxItem
的類開始,它繼承自ListBoxItem
。然後,我們定義一個依賴屬性,它用於在列表框中突出項目:
public class CustomListBoxItem : ListBoxItem
{
public static readonly DependencyProperty IsVirtuallySelectedProperty =
DependencyProperty.Register("IsVirtuallySelected", typeof(bool),
typeof(CustomListBoxItem),
new PropertyMetadata(false));
public CustomListBoxItem() : base()
{ }
public bool IsVirtuallySelected
{
get { return (bool)GetValue(IsVirtuallySelectedProperty); }
set { SetValue(IsVirtuallySelectedProperty, value); }
}
}
然後我們加入一個列表來定義樣式它在XAML:
<ListBox Name="listBox" MouseMove="listBox_MouseMove" SelectionChanged="listBox_SelectionChanged">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type local:CustomListBoxItem}">
<Style.Triggers>
<Trigger Property="IsVirtuallySelected" Value="true">
<Setter Property="Background" Value="SkyBlue"/>
</Trigger>
<Trigger Property="IsVirtuallySelected" Value="false">
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
其中local
是名稱空間,其中定義了CustomListBoxItem
。這就是我們所需要的XAML部分,真正的魔法發生在後面的代碼中。
的listBox_MouseMove
事件處理程序看起來像這樣:
private void listBox_MouseMove(object sender, MouseEventArgs e)
{
bool itemFound = false;
for (int i = 0; i < listBox.Items.Count; i++)
{
var currentItem = listBox.ItemContainerGenerator.ContainerFromIndex(i) as CustomListBoxItem;
if (currentItem == null)
continue;
// Check whether the cursor is on an item or not.
if (IsMouseOverItem(currentItem, e.GetPosition((IInputElement)currentItem)))
{
// Unselect all items before selecting the new group
listBox.Items.Cast<CustomListBoxItem>().ToList().ForEach(x => x.IsVirtuallySelected = false);
// Select the current item and the ones above it
for (int j = 0; j <= listBox.Items.IndexOf(currentItem); j++)
{
((CustomListBoxItem)listBox.Items[j]).IsVirtuallySelected = true;
}
itemFound = true;
break;
}
}
// If the item wasn't found for the mouse point, it means the pointer is not over any item, so unselect all.
if (!itemFound)
{
listBox.Items.Cast<CustomListBoxItem>().ToList().ForEach(x => x.IsVirtuallySelected = false);
}
}
而且IsMouseOverItem
輔助方法,其被用於確定如果光標在項目上,被定義如下:
private bool IsMouseOverItem(Visual item, Point mouseOverPoint)
{
Rect currentDescendantBounds = VisualTreeHelper.GetDescendantBounds(item);
return currentDescendantBounds.Contains(mouseOverPoint);
}
最後,作爲ListBox的點擊處理程序的listBox_SelectedChanged
事件處理程序:
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Get all the virtually selected items
List<CustomListBoxItem> selectedItems =
listBox.Items.Cast<CustomListBoxItem>().Where(x => x.IsVirtuallySelected).ToList();
if (selectedItems == null || !selectedItems.Any())
return;
// Do something with the selected items
DoCoolStuffWithSelectedItems();
// Unselsect all.
listBox.Items.Cast<CustomListBoxItem>().ToList().ForEach(x => x.IsVirtuallySelected = false);
listBox.UnselectAll();
}
而繁榮,我們完成了。現在,我們可以添加一些項目到ListBox在類的構造函數:
public MainWindow()
{
InitializeComponent();
listBox.Items.Add(new CustomListBoxItem { Content = "hello world!" });
listBox.Items.Add(new CustomListBoxItem { Content = "wpf is cool" });
listBox.Items.Add(new CustomListBoxItem { Content = "today is tuesday..." });
listBox.Items.Add(new CustomListBoxItem { Content = "I like coffee" });
}
注意我用了一個隨機的顏色,如XAML高亮顏色。隨意更改並試一試。
猜你需要這樣的事:
<ControlTemplate TargetType="ListBoxItem">
<TextBlock Text="{Binding LastOperation}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger>
<DataTrigger.Binding>
<MultiBinding>
<Binding Path="MouseOverIndex"/>
<Binding Path="CurrentIndex"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Foreground" Value="Gold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</ControlTemplate>
感謝您的回覆,但您如何綁定MouseOverIndex? –
MouseOverIndex和CurrentIndex是用於此UI的視圖模型的所有屬性。您可以將MouseOverIndex綁定到另一個DataTrigger,其中的代碼位於邏輯後面,如if(MouseOverIndexNewValue> MouseOverIndexOldValue){MouseOverIndexOldValue = MouseOverIndexNewValue; } – Nathan
- 1. QTreeView:獲取僅高亮顯示的項目列表(多選)
- 2. 火花表中的高亮項目
- 3. ListView中的高亮項目
- 4. silverlight 3列表框項目高亮與所選
- 5. XAML列表框項目沒有亮點
- 6. 如何保存列表視圖項目作爲高亮項目
- 7. 列表框項高亮顯示或在我的列表框選擇的混亂
- 8. 從列表框拖放多個項目
- 9. 我有一個列表框。如何從多個項目中選擇列表框中的第三個項目?
- 10. C#/ WinForms:通過拖放僅高亮列表框的第一項
- 11. 高亮所選項目
- 12. Python - 如何提高列表中多個項目的值錯誤
- 13. 第一項總是被讀,而不是選擇(高亮)項的列表框中
- 14. 如何獲取extjs組合框中高亮顯示的項目?
- 15. 高亮顯示多個選擇選項
- 16. 列表框項目分隔符多個項目時
- 17. 添加項目到多列列表框
- 18. 從列表框中刪除多個項目; XML中的更新
- 19. 從GridView列中選擇多個列表框項目
- 20. 將列表框1中的項目添加到綁定多項列表框2
- 21. 將多個列表框項添加到一個列表框中
- 22. tkinter刪除列表框中的多個未選定的項目
- 23. 多個列表中的項目
- 24. 查找多個列表中的項目?
- 25. 下拉列表中的多個項目
- 26. Python:re.sub列表中有多個項目的單個項目
- 27. 列表框中的多個默認選定項目
- 28. vb:如何一次選擇列表框中的多個項目?
- 29. 無法爲列表框中的多個項目執行宏
- 30. 如何從多個列表框中刪除相同的項目?
感謝您的詳細解釋。 –