我一直在使用AvalonDock(2.0)一段时间,这是在IDE中管理文档的关键。在过去一个月左右的时间里,我注意到 Alt 关键装饰不再显示AvalonDock中的控件,尽管 Alt 键命令正在按预期执行。请参阅下面的图片,其中 Alt 键装饰在菜单中显示,但不是AvalonDock中的按钮:
这个问题特别有趣,它似乎是由环境设置或条件引发的。
正如本video(2:07)所示,alt密钥装饰适用于AvalonDock中的控件。但是,如果我现在使用我在该视频中使用的相同的可执行文件,则alt密钥装饰不起作用。
我目前正在使用build 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 键装饰也会显示在AvalonDock之外的Test
按钮,但不会显示AvalonDock中控件的ClickMe
按钮。
我还在AvalonDock codeplex网站上发布了问题here,但似乎响应活动非常少。我还在Extended Toolkit codeplex站点上发布了问题here。
有关如何纠正或解决此问题的任何想法?
答案 0 :(得分: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 });
}
}
通过将以下内容添加到DataTemplate
的根元素中为AvalonDock LayoutItemTemplate
添加来自XAML:
<i:Interaction.Behaviors
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
<my:FixKeyboardCuesBehavior />
</i:Interaction.Behaviors>
此解决方法使用WPF的内部实现详细信息在已损坏的AvalonDock逻辑树下重新引入 Alt 行为。所以,当AD本身被修复时,我将期待能够从我的代码中删除它!