2009-02-27 4 views
1

XAML:Pourquoi mon bouton WPF n'est pas activé lorsque je le crée à l'exécution?

<Window x:Class="WorkOut.ToggleButton" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:s="clr-namespace:WorkOut.Code"   
Title="ToggleButton" Height="300" Width="300"> 
<Grid> 
    <StackPanel Orientation="Vertical"> 
     <ToolBar Height="40" VerticalAlignment="Top"> 
      <Button Margin="0,3,0,3" Padding="2" HorizontalContentAlignment="Left" 
        Command="{x:Static s:MyCanvas.AddNewTab}" 
        CommandTarget="{Binding ElementName=MyCanvas}"> 
       <Button.Content> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition /> 
          <ColumnDefinition /> 
         </Grid.ColumnDefinitions> 
         <TextBlock Margin="3" Text="Append New Tab" VerticalAlignment="Center" Grid.Column="1"/> 
        </Grid> 
       </Button.Content> 
      </Button> 
     </ToolBar> 
     <Grid x:Name="MyGrid"> 
     </Grid>    
    </StackPanel> 
</Grid> 

code:

public ToggleButton() 
    { 
     InitializeComponent(); 

     MyCanvas MyCanvas1 = new MyCanvas(); 
     MyCanvas1.Name = "MyCanvas"; 
     MyCanvas1.Background = System.Windows.Media.Brushes.LightBlue; 
     MyCanvas1.Height = 100; 
     MyCanvas1.Width = 100; 
     MyCanvas1.HorizontalAlignment = HorizontalAlignment.Left; 
     MyGrid.Children.Add(MyCanvas1); 

     MyCanvas MyCanvas2 = new MyCanvas(); 
     MyCanvas2.Name = "MyCanvas"; 
     MyCanvas2.Background = System.Windows.Media.Brushes.Beige; 
     MyCanvas2.Height = 100; 
     MyCanvas2.Width = 100; 
     MyCanvas2.HorizontalAlignment = HorizontalAlignment.Right; 
     MyGrid.Children.Add(MyCanvas2); 
    } 
class MyCanvas : Canvas 
{ 
    public static RoutedCommand AddNewTab = new RoutedCommand(); 
    public MyCanvas() 
    { 
     this.CommandBindings.Add(new CommandBinding(MyCanvas.AddNewTab, AddNewTab_Executed, AddNewTab_Enabled)); 
    } 
    private void AddNewTab_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     MessageBox.Show (this.Background.ToString()); 
    } 
    private void AddNewTab_Enabled(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 
}  

Le code ci-dessus créer deux toiles sur le contrôle du réseau et le bouton addnew dans la barre d'outil désactivé, eventhough il est lié à l'élément MyCanvas.

peut-être que je suis une mauvaise approche suivais ...

d'aide, très appréciée.

Merci KJ

+0

Pouvez-vous poster le code que vous utilisez pour créer le bouton? – JaredPar

+0

Xaml sera correctement formaté en code si vous utilisez le bouton 'Code' (ou indentez-le 4 espaces). Pouvez-vous reformater et resoumettre? – Adrian

+0

Comme vous l'avez demandé, l'a fait. –

Répondre

1

probablement parce que votre commande retourne sur CanExecute() faux, parce qu'il n'a pas d'objectif de commande.

+0

bonjour Pop Catalin, J'ai ligne commandTarget dans le fichier XAML comme ci-dessous ... CommandTarget = "{Binding ElementName = MyCanvas}"> –

+0

Comme je vois que vous créez le canevas cible dans le code, après le bouton est ajouté à la barre d'outils? cela provoquera l'échec de la liaison s'il ne trouve pas l'élément cible lorsque la liaison est instanciée ... –

+0

Définissez le CommandTarget en XAML sur MyGrid (les commandes routées traversent l'arborescence logique jusqu'à ce qu'elles trouvent un élément pouvant exécuter la commande). –

0

Avez-vous essayé le paramètre de gestionnaire CanExecute que l'événement a géré?

private void AddNewTab_Enabled(object sender, CanExecuteRoutedEventArgs e)  
{   
    e.CanExecute = true;  
    e.Handled = true 
} 
Questions connexes