Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尽管ICommand.CanExecute的计算结果为true,但按钮已禁用_C#_.net_Wpf_Commandbinding - Fatal编程技术网

C# 尽管ICommand.CanExecute的计算结果为true,但按钮已禁用

C# 尽管ICommand.CanExecute的计算结果为true,但按钮已禁用,c#,.net,wpf,commandbinding,C#,.net,Wpf,Commandbinding,我有两个WPF项目,一个是.NET4.7DLL,另一个是桌面应用程序 在我的dll中,我有Viewport2D和ViewportCommands类 My Viewport2D绑定ctor中的那些命令: public Viewport2D() { ... CommandBindings.Add(new CommandBinding(NavigationCommands.IncreaseZoom, ExecuteZoomIn, CanZoom));

我有两个WPF项目,一个是.NET4.7DLL,另一个是桌面应用程序

在我的dll中,我有Viewport2D和ViewportCommands类

My Viewport2D绑定ctor中的那些命令:

    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命令在大多数情况下也计算为true,并且两个函数都被调用,我已经检查过了

在我的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" />
递增缩放和递减缩放来自.Net的NavigationCommands类部分

上述代码段中的两个按钮始终处于禁用状态,尽管它们应该处于启用状态。但是,使用两个缩放命令进行缩放效果很好

我做错了什么?

我做了一个测试 如果绑定在用户控件中,则该绑定不起作用;如果我切换到MainWindow,它会工作…两者的xaml相同 --好--

--坏的--

    <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()
        {

        }
    }

visual studio的输出窗口中是否存在任何绑定错误??因为我发现绑定Viewport2D=手势很奇怪,看起来还行///但是ViewportCommands中一些静态命令上的按钮不一样???尝试一下对命令的引用是绝对正确的。我没有收到任何错误或异常。Command={Bindig ElementName=Zoombox,Path=ResetView}应该如何工作?ResetView不是Viewport2D的成员,而是ViewportCommands的成员。不确定…然后更改为类似命令的内容={Binding controls1:ViewportCommands.reset在窗口中查看或移动这两个命令的绑定代码,因为它在Viewport2D中,实际上这两者都是问题。正如我所说的,绑定到Viewport2D中的那些命令的方法被调用。我已经验证了这一点。类似Command=controls1:ViewportCommands.Res的命令引用etView也是有效的。我在代码中的任何地方都使用它,而且它是有效的。这不是我想要的解决方案,但它是有效的。谢谢
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));
    }
    <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()
        {

        }
    }