我正在编写一个WPF 95%的GUI应用程序,需要一个特定的快捷图标行为。 一个图像有时比(很多)单词更好,所以这里是基本布局: (作为新用户,无法附加图像...)
http://imageshack.us/f/705/appb.jpg/
- 底部子菜单中的每个图标代表应用程序中的控件“页面” - FIXED图标。 - 根据底部图标的点击,左侧的图标是快捷方式 - 最近和收藏夹。 - 我使用堆叠面板作为容器,物品的数量是固定的。 - 每个控件集都有自己的上下文菜单。
我想要完成的事情如下: 当用户点击底部菜单中的某个项目时,我希望它在“最近”面板中“神奇地显示”。当用户点击“最近”面板中的“删除”(上下文菜单)时,我需要(右键单击)图标消失。
现在我的(工作)解决方案令人难以置信的麻烦,我确信它是一个优雅的解决方案..
非常感谢任何建议, 丹尼尔。
答案 0 :(得分:1)
我假设你正在使用MVVM模式吗?如果没有,你应该是。
因此,假设您正在使用MVVM,那么这样的事情对您有用:
class BottomPanelViewModel
{
public BottomPanelViewModel()
{
Items = new ObservableCollection<PageViewModel>();
ItemsView = new ListCollectionView(Items);
ItemsView.CurrentChanged += SelectionChanged;
}
public ObservableCollection<PageViewModel> Items { get; private set; }
public ListCollectionView ItemsView { get; private set; }
}
class RecentPanelViewModel
{
public RecentPanelViewModel()
{
Items = new ObservableCollection<PageViewModel>();
}
public ObservableCollection<PageViewModel> Items { get; private set; }
}
class WindowViewModel
{
public WindowViewModel()
{
BottomPanel = new BottomPanelViewModel();
RecentPanel = new RecentPanelViewModel();
BottomPanel.CurrentChanged += (s, e) =>
{
RecentPanel.Items.Add(BottomPanel.ItemsView.CurrentItem);
};
}
public BottomPanelViewModel BottomPanel { get; private set; }
public RecentPanelViewModel RecentPanel { get; private set; }
}
在窗口构造函数中,创建一个WindowViewModel实例并将其用作DataContext:
public Window()
{
InitializeComponent();
DataContext = new WindowViewModel();
}
然后在您的XAML中,您可以绑定到WindowViewModel的属性:
<Window ...>
<DockPanel>
<ListBox DockPanel.Dock="Bottom"
ItemsSource="{Binding BottomPanel.ItemsView}"
IsSynchronizedWithCurrentItem="True"/>
<ListBox DockPanel.Dock="Left"
ItemsSource="{Binding RecentPanel.Items}"/>
</DockPanel>
</Window>
说明:WindowViewModel包含BottomPanelViewModel和RecentPanelViewModel。每个包含一个ObservableCollection of Items,底部面板还公开一个集合视图。集合视图允许我们在UI中跟踪当前选择。
我在示例XAML中使用简单的ListBox,但您可以使用您喜欢的任何ItemsControl。
当底部面板中的选择发生变化时,窗口视图模型会听到此信息,并将所选项目添加到最近面板的ObservableCollection中。你显然想在这里添加逻辑来检查重复等。