4

私はしばらくの間 AvalonDock (2.0) を使用しており、IDE でドキュメントを管理するための鍵となっています。先月かそこらで、キー コマンドは期待どおりに実行されているAltにもかかわらず、キー装飾が AvalonDock 内のコントロールに表示されなくなっていることに気付きました。Alt下の画像では、Alt主な装飾がメニューに表示されていますが、AvalonDock 内のボタンは表示されていません。

Alt キーなし

この問題で特に興味深いのは、環境設定または条件によって引き起こされるように見えることです。

このビデオ(2:07) で示されているように、Alt キーの装飾は AvalonDock 内のコントロールに対して機能しています。しかし、そのビデオで使用したのとまったく同じ実行可能ファイルを使用すると、alt キーの装飾が機能しません。

現在、ビルド 2.0.1746 を使用していますが、ビルド 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>

この単純なアプリケーションでも、Alt主要な装飾Testは AvalonDock の外側のボタンには表示されますが、 ClickMeAvalonDock 内のコントロールのボタンには表示されません。

AvalonDockコードプレックス サイトにもこの問題を投稿しましたが、応答アクティビティはほとんどないようです。この問題は、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>

Altこの回避策は、WPF の内部実装の詳細を使用して、壊れた AvalonDock 論理ツリーの下に動作を再導入します。したがって、AD 自体が修正されたときにコードからザッピングできることを楽しみにしています。

于 2014-04-13T22:34:30.010 に答える