我有两个WPF项目,一个是.Net 4.7 dll,另一个是桌面应用程序。尽管ICommand.CanExecute的计算结果为true,但按钮禁用了
在我的DLL我有类Viewport2D
和ViewportCommands
public static class ViewportCommands
{
public static RoutedCommand ResetView { get; } = new RoutedCommand(nameof(ResetView), typeof(ViewportCommands));
public static RoutedCommand ZoomFit { get; } = new RoutedCommand(nameof(ZoomFit), typeof(ViewportCommands));
}
我Viewport2D结合的构造函数的命令:
public Viewport2D()
{
...
CommandBindings.Add(new CommandBinding(NavigationCommands.IncreaseZoom, ExecuteZoomIn, CanZoom));
CommandBindings.Add(new CommandBinding(NavigationCommands.DecreaseZoom, ExecuteZoomOut, CanZoom));
CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), CanZoom));
CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true));
...
}
正如你可以看到ResetView
命令结果始终为true。在大多数情况下,ZoomFit
命令的求值也为真(并且两个函数都被调用,我已经检查过)。
在我的WPF应用程序我使用这个控制:
<controls1:Viewport2D x:Name="Zoombox" ...>
<controls1:Viewport2D.InputBindings>
<MouseBinding Gesture="{wpfUtils:MouseWheel Direction=Down}" Command="DecreaseZoom" CommandTarget="{Binding ElementName=Zoombox}" />
<MouseBinding Gesture="{wpfUtils:MouseWheel Direction=Up}" Command="IncreaseZoom" CommandTarget="{Binding ElementName=Zoombox}" />
</controls1:Viewport2D.InputBindings>
...
</controls1:Viewport2D>
...
<Button Content="100%" Width="70" Command="controls1:ViewportCommands.ResetView" />
<Button Content="Zoom Fit" Width="70" Command="controls1:ViewportCommands.ZoomFit" />
的IncreaseZoom
和DecreaseZoom
来自NavigationCommands
类(.NET的一部分)。
上述代码段中的两个按钮始终处于禁用状态,但应启用它们。不过,使用两个缩放命令缩放都可以。
我在这里做错了什么?
你有没有visual studio输出窗口中的任何绑定错误?因为我发现奇怪你绑定Viewport2D =手势似乎没问题///但ViewportCommands中的某些静态命令上的按钮不一样? – GCamel
尝试 – GCamel
对命令的引用绝对没问题。我没有收到任何错误或异常。应该如何使用命令=“{Bindig ElementName = Zoombox,Path = ResetView}”'甚至可以工作? ResetView不是Viewport2D的成员,而是ViewportCommands的成员。 – Timo