我正在用一個用戶控制元件實作一個垂直的左下拉選單,它的內部有一個擴展器。UserControl有一個DependencyProperty,它期望一個ListView(選單的專案),也有一個依賴屬性 "IsSelected",它與Expander屬性 "IsExpanded "系結。我想實作一個功能,當用戶點擊UserControlMenu時,打開這個(如果是關閉的)并關閉其他的。我附上了我的類和UserControl,但是,現在我只得到了當你點擊UserControlMenu時,這個打開并在那一刻關閉。
UserControl XAML
<UserControl x:Class="DropDownMenuExpander.UserControlMenuItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/span>
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"。
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"。
mc:Ignorable="d"/span> >
<Grid>/span>
<md: PackIcon Kind="{Binding Path=Icon}"/span> Width="15" Height="15" Margin="10 16"/>
<Expander x: Name="ExpanderMenu" Header="{Binding Path=Header}"/span> IsExpanded="{Binding Path=IsSelected}"/span> Width="210" HorizontalAlignment="Right" Background="{x: Null}">
<ContentControl Content="{binding ListView}"/>
</Expander>/span>
</Grid>/span>
</UserControl>
UserControl .cs
public partial class UserControlMenuItem 。用戶控制
{
public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register("Header", typeof(string), typeof(UserControlMenuItem))。
公共字串Header
{
獲取
{
回傳(字串)GetValue(HeaderProperty)。
}
設定
{
SetValue(HeaderProperty, value)。
}
}
public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(UserControlMenuItem));
public bool IsSelected
{
得到
{
回傳(bool)GetValue(IsSelectedProperty)。
}
設定
{
SetValue(IsSelectedProperty, value)。
}
}
public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(PackIconKind), typeof(UserControlMenuItem))。
公共PackIconKind Icon
{
得到
{
回傳(PackIconKind)GetValue(IconProperty)。
}
設定
{
SetValue(IconProperty, value)。
}
}
public static readonly DependencyProperty ListViewProperty = DependencyProperty.Register("ListView", typeof(ListView), typeof(UserControlMenuItem), new UIPropertyMetadata(null)) 。
public ListView ListView
{
得到
{
return (ListView)GetValue(ListViewProperty);
}
設定
{
SetValue(ListViewProperty, value)。
}
}
公共UserControlMenuItem()
{
InitializeComponent();
DataContext = this;
}
}
在主視窗中呼叫 UserControl
<StackPanel x: 名稱="st_menu" margin="10" Orientation="Vertical" ScrollViewer. CanContentScroll="True">/span>。
<local:UserControlMenuItem x: Name="MenuItemHome" Header="Home" Icon="Home" PreviewMouseDown="MenuItemHome_PreviewMouseDown" >
<local:UserControlMenuItem.ListView>
< ListView SelectionMode="Single" Margin="0 16 0 16">
<ListViewItem>/span>
<TextBlock Text="Item1"/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="Item2"/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="Item3"/>
</ListViewItem>/span>
</ListView>/span>
</local:UserControlMenuItem.ListView>
</local:UserControlMenuItem>
<local:UserControlMenuItem x: Name="MenuItem2" Header="User" Icon="User" PreviewMouseDown="MenuItemHome_PreviewMouseDown" >
<local:UserControlMenuItem.ListView>
< ListView SelectionMode="Single" Margin="0 16 0 16">
<ListViewItem>/span>
<TextBlock Text="User1"/span>/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="User2"/span>/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="User3"/span>/>
</ListViewItem>/span>
</ListView>/span>
</local:UserControlMenuItem.ListView>
</local:UserControlMenuItem>
<local:UserControlMenuItem x: Name="MenuMes2" Header="Messages" Icon="Chat"/span> PreviewMouseDown="MenuItemHome_PreviewMouseDown"/span>>
<local:UserControlMenuItem.ListView>
< ListView SelectionMode="Single" Margin="0 16 0 16">
<ListViewItem>/span>
<TextBlock Text="Message1"/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="Message2"/>
</ListViewItem>/span>
<ListViewItem>/span>
<TextBlock Text="Message3"/>
</ListViewItem>/span>
</ListView>/span>
</local:UserControlMenuItem.ListView>
</local:UserControlMenuItem>
</StackPanel>/span>
MainWindow.cs
public partial class MainWindow : Window
{
公共的MainWindow()
{
InitializeComponent();
MenuItemHome.IsSelected = true;
}
private void MenuItemHome_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
foreach (var item in st_menu.Children)
{
如果(item是UserControlMenuItem menuItem)
{
如果(menuItem.Equals(sender as UserControlMenuItem))
{
menuItem.IsSelected = true。
}
否則
{
menuItem.IsSelected = false;
}
}
}
}
}
uj5u.com熱心網友回復:
你應該設定eventArgs.Handled = true;,它將停止事件的冒泡,比如:
private void MenuItemHome_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
foreach (var item in st_menu.Children)
{
if (item is UserControlMenuItem menuItem && sender is UserControlMenuItem senderItem)
{
menuItem.IsSelected = menuItem.Equals(senderItem) && !senderItem.IsSelected;
e.Handled = true; //告訴視覺樹該事件已經被處理了
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312728.html
標籤:
