从弹出菜单关闭TabItem
本文关键字:TabItem 菜单 | 更新日期: 2023-09-27 18:24:54
这里我有一个使用Prism 6工具包的功能性CloseTabAction,如下所示:
class CloseTabAction : TriggerAction<Button>
{
protected override void Invoke(object parameter)
{
var args = parameter as RoutedEventArgs;
if (args == null) return;
var tabItem = FindParent<TabItem>(args.OriginalSource as DependencyObject);
if (tabItem == null) return;
var tabControl = FindParent<TabControl>(tabItem);
if (tabControl == null) return;
var region = RegionManager.GetObservableRegion(tabControl).Value;
if (region == null) return;
if (region.Views.Contains(tabItem.Content))
{
region.Remove(tabItem.Content);
}
}
static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
while (true)
{
var parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
var parent = parentObject as T;
if (parent != null) return parent;
child = parentObject;
}
}
}
我的问题是,只有当用户选择"是"(保存到数据库并关闭)或"否"(不保存但关闭选项卡)时,我才想关闭TabItem。
我已经创建了一个自定义的弹出窗口来实现这一点,但我不知道如何将其连接到CloseTabAction。它怎么知道构象是真是假呢?
这是一个粗略的想法:
if (region.Views.Contains(tabItem.Content) && Status)
{
region.Remove(tabItem.Content);
}
public bool Status { get; set; }
private void RaiseClosePopup()
{
ClosePopupRequest.Raise(new Confirmation{Title = "Confrim", Content = "Are you sure you want to close this view?"}, r => Status = r.Confirmed);
}
我看到你看了我的Pluralsight课程,学习如何掌握带棱镜的TabControl:)
为什么不在调用"删除"之前显示一个对话框呢。如果对话框的结果有效,则继续删除;如果无效,则不删除。然后,您只需要决定如何将操作通知ViewModel。这可以通过多种方式实现;事件聚合器,在CloseTabAction触发器上公开属性,在触发器上公开命令。你可以决定你想怎么做。
编辑:实际上我想了一个更好的方法。只需使用ViewModel之外的一个界面,检查该界面是否可以关闭TabItem。也许可以使用IConfirmNavigationRequest接口或创建自己的接口。然后在移除该区域之前进行检查。这更容易。
在invoke方法中,我添加了这段代码。它检查它是否实现了我的自定义"IConfrimCloseRequest"接口,然后根据该结果调用"ConfrimCloseRequest"方法关闭或取消。如果它没有实现接口,那么无论如何都要关闭它。
var context = new NavigationContext(region.NavigationService, null);
if (IfImplements<IConfirmCloseRequest>(tabItem.Content,
i => i.ConfirmCloseRequest(context, canClose =>
{
if (!canClose) return;
if (region.Views.Contains(tabItem.Content))
region.Remove(tabItem.Content);
}))) return;
if (region.Views.Contains(tabItem.Content))
region.Remove(tabItem.Content);
private static T Implementor<T>(object content) where T : class
{
T implementor = content as T;
if (implementor != null) return implementor;
var element = content as FrameworkElement;
if (element != null) implementor = element.DataContext as T;
return implementor;
}
private static bool IfImplements<T>(object content, Action<T> action) where T : class
{
T target = Implementor<T>(content);
if (target == null) return false;
action(target);
return true;
}
在我的ViewModel中,我用方法"ConfirmCloseRequest"实现了我的自定义接口,该方法将在关闭选项卡时调用
public void ConfirmCloseRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
ClosePopupRequest.Raise(new Confirmation { Title = "Confrim", Content = "Are you sure you want to close this view?" }, r => { continuationCallback(r.Confirmed); });
}