Frage

Ich verwende AvalonDock (2.0) schon seit einiger Zeit, da es der Schlüssel zum Verwalten von Dokumenten in einer IDE ist.Im letzten Monat oder so ist mir das aufgefallen Alt Wichtige Verzierungen werden für Steuerelemente in AvalonDock nicht mehr angezeigt, obwohl die Alt Tastaturbefehle werden wie erwartet ausgeführt.Sehen Sie sich das Bild unten an, wo die Alt Wichtige Verzierungen werden im Menü angezeigt, jedoch nicht für die Schaltflächen in AvalonDock:

No Alt Keys

Das Besondere an diesem Problem ist, dass es offenbar durch eine Umgebungseinstellung oder -bedingung ausgelöst wird.

Wie hier gezeigt Video (um 2:07) funktionieren die Alt-Tasten-Verzierungen für eine Steuerung in AvalonDock.Wenn ich jetzt jedoch dieselbe ausführbare Datei verwende, die ich in diesem Video verwendet habe, funktionieren die Alt-Tasten-Verzierungen nicht.

Ich verwende derzeit Build 2.0.1746, habe aber auch Build 2.0.2000 (mit dem Xceed-Namespace) ausprobiert und das gleiche Problem festgestellt.Ich habe auch die im Paket enthaltene Version ausprobiert Xceed Erweitertes WPF-Toolkit, und stellte fest, dass das Problem weiterhin besteht.

Ich habe auch eine sehr einfache Testanwendung erstellt, die einige Dokumente dieses Typs lädt Item, Wo Item ist eine einfache Klasse mit a Name Eigentum:

<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>

Selbst mit dieser einfachen Anwendung ist die Alt Schlüsselverzierungen erscheinen für die Test Schaltfläche außerhalb von AvalonDock, aber nicht für ClickMe Schaltflächen für die Steuerelemente in AvalonDock.

Ich habe das Problem auch gepostet Hier auf der AvalonDock-Codeplex-Site, aber es scheint sehr wenig Antwortaktivität zu geben.Ich habe das Problem auch gepostet Hier auf der Extended Toolkit-Codeplex-Site.

Irgendwelche Ideen, wie dieses Problem behoben oder umgangen werden kann?

War es hilfreich?

Lösung

Es hört sich so an, als ob dies mit der nächsten Version von AvalonDock behoben wird.

In der Zwischenzeit ist das folgende Blend-Verhalten eine Problemumgehung:

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 });
    }
}

Verwenden Sie dies aus XAML, indem Sie Folgendes zum Stammelement Ihres hinzufügen DataTemplate für das AvalonDock LayoutItemTemplate:

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

Diese Problemumgehung verwendet interne Implementierungsdetails von WPF, um das erneut einzuführen Alt Verhalten unterhalb des kaputten logischen AvalonDock-Baums.Ich freue mich also darauf, es aus meinem Code entfernen zu können, wenn AD selbst behoben ist!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top