gpt4 book ai didi

wpf - 使用 Prism 激活/停用工具栏按钮

转载 作者:行者123 更新时间:2023-12-02 09:39:23 26 4
gpt4 key购买 nike

我正在学习 Prism 框架,并且已经取得了进展。但我想知道如何创建工具栏(和上下文菜单),其中每个模块都可以注册自己的按钮。

对于此示例,我希望所有按钮都驻留在位于我的 Shell 中的同一个 ToolBar 控件中。工具栏 ItemsSource绑定(bind)到 ToolBarItems类型属性ObservableCollection<FrameworkElement>在 View 模型中。可以使用 ToolBarRegistry 将元素添加到此集合中服务。这是 View 模型:

public class ShellViewModel
{
private IToolBarRegistry _toolBarRegistry;
private ObservableCollection<FrameworkElement> _toolBarItems;

public ShellViewModel()
{
_toolBarItems = new ObservableCollection<FrameworkElement>();
_toolBarRegistry = new ToolBarRegistry(this);
}

public ObservableCollection<FrameworkElement> ToolBarItems
{
get { return _toolBarItems; }
}
}

请注意,如果这是正确的解决方案,FrameworkElement 类型的集合将被重构为更具体的类型。

我的ToolBarRegistry有一个注册图像按钮的方法:

public void RegisterImageButton(string imageSource, ICommand command)
{
var icon = new BitmapImage(new Uri(imageSource));

var img = new Image();
img.Source = icon;
img.Width = 16;

var btn = new Button();
btn.Content = img;
btn.Command = command;

_shellViewModel.ToolBarItems.Add(btn);
}

我从我的OrderModule调用这个方法并且按钮正确显示。到目前为止一切顺利。

问题是我如何控制何时再次删除这些按钮。如果我导航到另一个模块中的 View (有时是同一模块中的另一个 View ),我希望再次隐藏这些特定于模块的按钮。

您对如何做到这一点有什么建议吗?我是否以错误的方式处理这个问题,或者我可以修改我已有的内容吗?您是如何解决这个问题的?

最佳答案

我不会在 ObservableCollection 中插入 Button 实例。考虑一下这种方法:

为工具栏按钮创建ViewModel

class ToolBarButtonViewModel : INotifyPropertyChanged
{
// INotifyPropertyChanged implementation to be provided by you

public string ImageSource { get; set; }
public ICommand Command { get; set; }
public bool IsVisible { get; set; }
}

然后当然将 ToolBarItems 的类型更改为这些的集合。

ShellView 中,为 ToolBarButtonViewModel 添加一个 DataTemplate 并绑定(bind)工具栏控件的 ItemsSource ViewModel 的集合,例如:

<DataTemplate>
<Button Command="{Binding Command}">
<Button.Content>
<Image Source="{Binding ImageSource}" />
</Button.Content>
</Button>
</DataTemplate>

您现在可以使用 BooleanToVisibilityConverterButton.Visibility 绑定(bind)到 IsVisible解决您眼前的问题。

作为额外的好处,您还可以:

  • 完全通过 XAML 更改工具栏按钮的视觉外观
  • 将工具栏按钮的可视化树的任何属性绑定(bind)到 ToolBarButtonViewModel 上的相应属性

更新

启用/禁用按钮的机制取决于您的应用程序的具体情况。有很多选项 - 这里有一些(阅读时请记住 this chart):

  • 实现INavigationAware在您的 View 或 View 模型中并根据需要启用/禁用按钮
  • 将处理程序附加到 events of IRegionNavigationService感兴趣的区域并让处理程序启用或禁用按钮
  • 通过您自己的代码 (CustomNavigationService) 路由所有导航,并决定在其中执行哪些操作

关于wpf - 使用 Prism 激活/停用工具栏按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com