ToolBar OverflowPanel保持打开状态

时间:2015-11-16 10:15:18

标签: c# wpf data-binding datatemplate

我有一个ToolBar ItemsTemplate,在OverflowPanel可用之前一直正常工作。 如果我选择其中一个上下文操作,则OverflowPanel不会关闭。

只有通过ItemsSource绑定添加项目时才会出现问题:

     <ToolBar ItemsSource="{Binding ContextActionViewModels}"
             Background="Transparent"
             ToolBarTray.IsLocked="True"
             FocusManager.IsFocusScope="False">
        <ToolBar.ItemTemplateSelector>
            <views:ContextActionTemplateSelector>
                <views:ContextActionTemplateSelector.SimpleContextActionDataTemplate>
                    <DataTemplate DataType="{x:Type viewModels:SimpleContextActionViewModel}">
                        <Button Name="Button"
                                Command="{Binding ActionCommand}"
                                Style="{StaticResource ToolBarButtonStyle}"
                                ToolTip="{userInterface:Translation Binding={Binding ToolTip}}">
                            <ContentControl Template="{Binding Icon,Converter={StaticResource NameToResourceConverter}}"
                                            Margin="5"
                                            VerticalAlignment="Center"
                                            HorizontalAlignment="Center" />
                        </Button>
                    </DataTemplate>
                </views:ContextActionTemplateSelector.SimpleContextActionDataTemplate>

   <!-- Multiple DataTemplates follow!-->

为什么DataTemplate / ItemTemplteSelector无法正常工作。虽然XAML中的硬编码按钮工作正常吗?

我上传了一个完整的示例,说明了哪些内容不起作用here: 只需调整窗口大小,然后尝试从OverflowPanel中的按钮调用一个窗口。当'ICommand'正确执行时,Popup保持打开状态。

1 个答案:

答案 0 :(得分:1)

.NET framework source中,您可以找到处理OverflowPanelToolBar的结束行为的方法:

private static void _OnClick(object e, RoutedEventArgs args)
{
    ToolBar toolBar = (ToolBar)e;
    ButtonBase bb = args.OriginalSource as ButtonBase;
    if (toolBar.IsOverflowOpen && bb != null && bb.Parent == toolBar)
        toolBar.Close();
}

定义DataTemplate并使用ItemsSource属性时,创建按钮的Parent属性变为null,if检查失败。这是DataTemplate的预期行为,如here所述:

  

对于模板,模板的Parent最终将为null。要超越这一点并扩展到实际应用模板的逻辑树,请使用TemplatedParent。

作为解决方案,您可以在单击任何按钮时将IsOverflowOpen属性设置为false:

<ToolBar Name="SomeToolBar" ItemsSource="{Binding Items}">
    <ToolBar.ItemTemplate>
        <DataTemplate DataType="local:ItemViewModel">
            <Button Command="{Binding Command}" Content="{Binding Name}" Click="ButtonBase_OnClick"/>
        </DataTemplate>
    </ToolBar.ItemTemplate>
</ToolBar>

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    SomeToolBar.IsOverflowOpen = false;
}