簡體   English   中英

盡管ICommand.CanExecute計算為true,但按鈕已禁用

[英]Button disabled although ICommand.CanExecute evaluates to true

我有兩個WPF項目,一個是.Net 4.7 dll,另一個是桌面應用程序。

在我的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將這些命令綁定在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" />

IncreaseZoomDecreaseZoom來自NavigationCommands類(.Net的一部分)。

盡管上面的代碼片段中的兩個按鈕都應啟用,但它們始終被禁用。 但是,使用兩個縮放命令進行縮放都可以。

我在這里做錯了什么?

如果綁定在用戶控件中,我將進行測試; 如果我更改為MainWindow,則對...都適用... 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));
    }

- - 壞 - -

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

        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM