[英]Button disabled although ICommand.CanExecute evaluates to true
我有兩個WPF項目,一個是.Net 4.7 dll,另一個是桌面應用程序。
在我的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將這些命令綁定在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" />
IncreaseZoom
和DecreaseZoom
來自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.