2017-07-27 45 views
0

我有两个WPF项目,一个是.Net 4.7 dll,另一个是桌面应用程序。尽管ICommand.CanExecute的计算结果为true,但按钮禁用了

在我的DLL我有类Viewport2DViewportCommands

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

IncreaseZoomDecreaseZoom来自NavigationCommands类(.NET的一部分)。

上述代码段中的两个按钮始终处于禁用状态,但应启用它们。不过,使用两个缩放命令缩放都可以。

我在这里做错了什么?

+0

你有没有visual studio输出窗口中的任何绑定错误?因为我发现奇怪你绑定Viewport2D =手势似乎没问题///但ViewportCommands中的某些静态命令上的按钮不一样? – GCamel

+0

尝试

+0

对命令的引用绝对没问题。我没有收到任何错误或异常。应该如何使用命令=“{Bindig ElementName = Zoombox,Path = ResetView}”'甚至可以工作? ResetView不是Viewport2D的成员,而是ViewportCommands的成员。 – Timo

回答

1

我做了一个测试 如果绑定是在用户控制它不起作用;如果我改变主窗口,它的工作原理...两个 相同的XAML ---- ----好

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), (o, e) => e.CanExecute = true)); 
     CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true)); 
    } 


    public void ZoomFit() 
    { 

    } 
    public void Reset() 
    { 

    } 

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

---- ---- BAD

<Window x:Class="WpfApp1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApp1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <local:UserControl1></local:UserControl1> 
     <Button Content="100%" Width="70" Command="local:ViewportCommands.ResetView" /> 
     <Button Content="Zoom Fit" Width="70" Command="local:ViewportCommands.ZoomFit" /> 
    </StackPanel> 
</Window> 


public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 

      CommandBindings.Add(new CommandBinding(ViewportCommands.ZoomFit, (o, e) => ZoomFit(), (o, e) => e.CanExecute = true)); 
      CommandBindings.Add(new CommandBinding(ViewportCommands.ResetView, (o, e) => Reset(), (o, e) => e.CanExecute = true)); 
     } 


     public void ZoomFit() 
     { 

     } 
     public void Reset() 
     { 

     } 
    } 
+0

不是我想要的解决方案,但它有效。谢谢 – Timo

相关问题