4

我已经使用 AvalonDock (2.0) 有一段时间了,它是在 IDE 中管理文档的关键。在过去一个月左右的时间里,我注意到Alt在 AvalonDock 中的控件不再显示按键装饰,尽管Alt按键命令按预期执行。请参阅下图,其中Alt关键装饰显示在菜单中,但不显示 AvalonDock 内的按钮:

没有 Alt 键

这个问题特别有趣的是,它似乎是由环境设置或条件触发的。

如本视频所示(2:07),alt 键装饰用于 AvalonDock 中的控件。但是,如果我现在使用我在该视频中使用的完全相同的可执行文件,则 alt 键装饰不起作用。

我目前使用的是 build 2.0.1746,但我也尝试了 build 2.0.2000(使用 Xceed 命名空间)并发现了同样的问题。我还尝试了使用Xceed Extended WPF Toolkit打包的版本,发现问题仍然存在。

我还构建了一个非常简单的测试应用程序,它加载了几个类型的文档Item,其中Item是一个带有Name属性的简单类:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:avalonDock="clr-namespace:Xceed.Wpf.AvalonDock;assembly=Xceed.Wpf.AvalonDock"
        xmlns:avalonDockLayout="clr-namespace:Xceed.Wpf.AvalonDock.Layout;assembly=Xceed.Wpf.AvalonDock"
        xmlns:avalonDockControls="clr-namespace:Xceed.Wpf.AvalonDock.Controls;assembly=Xceed.Wpf.AvalonDock"
        Title="MainWindow" Height="500" Width="500">
    <Window.Resources>
        <ResourceDictionary>
            <DataTemplate DataType="{x:Type local:Item}">
                <StackPanel Orientation="Vertical">
                    <Label Content="Item:" />
                    <TextBox Text="{Binding Name}"/>
                    <Button Content="_ClickMe" />
                </StackPanel>
            </DataTemplate>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="*"></RowDefinition>
          <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <avalonDock:DockingManager Grid.Row="0"  DocumentsSource="{Binding}">
            <avalonDockLayout:LayoutRoot>
                <avalonDockLayout:LayoutPanel Orientation="Horizontal">
                    <avalonDockLayout:LayoutDocumentPane/>
                </avalonDockLayout:LayoutPanel>
            </avalonDockLayout:LayoutRoot>
        </avalonDock:DockingManager>
        <Button Grid.Row="1" Content="_Test" />
    </Grid>
</Window>

即使使用这个简单的应用程序,AvalonDock 外部的按钮也会Alt显示关键装饰,但 AvalonDock内的控件按钮不会显示。TestClickMe

我还在 AvalonDock codeplex 网站上发布了这个问题但似乎很少有响应活动。我还在Extended Toolkit codeplex 网站上发布了这个问题

关于如何纠正或解决此问题的任何想法?

4

1 回答 1

2

听起来这将在下一版本的 AvalonDock 中得到修复。

同时,以下 Blend 行为是一种解决方法:

public class FixKeyboardCuesBehavior : Behavior<UIElement>
{
    private static readonly DependencyProperty ShowKeyboardCuesProperty;

    static FixKeyboardCuesBehavior()
    {
        Type keyboardNavigation = typeof(KeyboardNavigation);
        var field = keyboardNavigation.GetField("ShowKeyboardCuesProperty", BindingFlags.NonPublic | BindingFlags.Static);

        Debug.Assert(field != null, "field != null");

        ShowKeyboardCuesProperty = (DependencyProperty)field.GetValue(null);
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        Window rootWindow = Window.GetWindow(this.AssociatedObject);
        if (rootWindow == null)
        {
            return;
        }

        BindingOperations.SetBinding(
            this.AssociatedObject,
            ShowKeyboardCuesProperty,
            new Binding("(KeyboardNavigation.ShowKeyboardCues)") { Source = rootWindow });
    }
}

通过将以下内容添加到DataTemplateAvalonDock的根元素中,从 XAML 中使用它LayoutItemTemplate

<i:Interaction.Behaviors
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <my:FixKeyboardCuesBehavior />
</i:Interaction.Behaviors>

此解决方法使用 WPF 的内部实现细节来重新引入Alt损坏的 AvalonDock 逻辑树下的行为。所以,我期待在 AD 本身修复后能够从我的代码中删除它!

于 2014-04-13T22:34:30.010 回答