2017-07-27 6 views
0

Ich habe zwei WPF-Projekte, eines ist eine .NET 4.7-DLL und das andere ist eine Desktop-App.Schaltfläche deaktiviert, obwohl ICommand.CanExecute zu True ausgewertet wird

In meiner dll habe ich die Klassen Viewport2D und 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)); 
} 

Meine Viewport2D diese Befehle in dem Ctor binden:

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

     ... 
    } 

Wie Sie den ResetView Befehl immer den Wert true sehen. Der ZoomFit Befehl wird in den meisten Fällen auch als wahr ausgewertet (und beide Funktionen werden aufgerufen, das habe ich bereits überprüft).

In meiner WPF-Anwendung verwende ich diese Kontrolle:

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

Die IncreaseZoom und DecreaseZoom sind aus dem NavigationCommands Klasse (Teil des .NET).

Beide Schaltflächen aus dem obigen Code sind immer deaktiviert, obwohl sie aktiviert sein sollten. Das Zoomen mit beiden Zoom-Befehlen funktioniert jedoch einwandfrei.

Was mache ich hier falsch?

+0

haben Sie jeder verbindliche Fehler im Ausgabefenster von Visual Studio? weil ich merkwürdig fand, dass du das Viewport2D bindst = Geste scheint ok /// aber die Knöpfe auf einigen statischen Befehlen in ViewportCommands sind nicht das selbe ??? – GCamel

+0

versuchen

+0

Der Verweis auf den Befehl ist absolut in Ordnung. Ich bekomme keine Fehler oder Ausnahmen. Wie sollte 'Command =" {Bindig ElementName = Zoombox, Path = ResetView} "' funktionieren? ResetView ist kein Mitglied von Viewport2D, sondern von ViewportCommands. – Timo

Antwort

1

Ich mache einen Test Wenn die Bindung in einem Benutzer Steuerelement ist, funktioniert es nicht; wenn ich auf Mainwindow ändern, es funktioniert ... gleichen XAML für beide ---- ---- GOOD

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

Nicht die Lösung, die ich gerne hätte, aber es funktioniert. Vielen Dank – Timo

Verwandte Themen