2017-09-07 1 views
1

J'ai un problème avec les boutons dans WPF.
Je développe une interface graphique qui a beaucoup de pages et de boutons relatifs (> 50).
L'interface graphique est censée être utilisée avec un écran tactile, de sorte que chaque bouton n'a que deux états graphiques enfoncés et normaux (il n'y a pas d'état stationnaire), comme n'importe quel bouton d'une application smartphone.
Actuellement, je suis en utilisant cette solution ici:C# WPF - Problèmes de deux états. (Cliquez sur l'événement avec l'écran tactile)

ressources fichier

<Application.Resources> 
    <Style x:Key="flatButtonStyle" TargetType="Button"> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Border Name="border" 
         Background="{TemplateBinding Background}"> 
         <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center" /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Application.Resources> 

Dans l'une de la page

<Button 
    Uid=".../image_up.png" 
    Tag=".../image_down.png" 
    Style="{StaticResource flatButtonStyle}" 
    TouchLeave="buttonImageUp" 
    TouchDown="buttonImageDown" 
    Click="clickEvent" 
    ClickMode="Press" 
    > 
    <Button.Background> 
     <ImageBrush ImageSource=".../image_up.png" Stretch="Uniform"/> 
    </Button.Background> 
</Button> 

A l'intérieur du fichier C# lié

private void buttonImageDown(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    button.Content = new Image { 
     Source = new BitmapImage(new Uri(button.Tag + "")), 
     VerticalAlignment = VerticalAlignment.Center, 
     Stretch = Stretch.Uniform 
    }; 
} 

private void buttonImageUp(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    button.Content = new Image { 
     Source = new BitmapImage(new Uri(button.Uid)), 
     VerticalAlignment = VerticalAlignment.Center, 
     Stretch = Stretch.Uniform 
    }; 
} 

Cette Implémentation a beaucoup de problème:

  • Je ne peux pas utiliser uid et Tag

  • réponse lente, car elle doit exécuter une fonction C# 2 fois par contact

  • Je dois copier la fonction C# chaque fois que je dois utiliser un bouton dans une nouvelle page

  • Mais le vrai problème est que je ne sais pas pourquoi le clickEvent ne se déclenchera pas quand un bouton est enfoncé, et sur certains ordinateurs le clickEvent ne fonctionne que pour les 3 premiers ~ 5 fois que seulement TouchDonw et TouchLeave fonctionnent ...

(J'utilise .NET 4.6.1 mais même comportement avec 4.5.2 et 4.7)

Je pense est possible d'éliminer le composant C# et changer l'image (source) du bouton juste avec XAML, mais je cherche un moment et je ne trouve rien.

Quelqu'un peut-il m'aider s'il vous plaît?

+1

Essayez-vous d'émuler [ToggleButton] (https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.togglebutton (v = vs.110) .aspx)? – icebat

+0

Vous ne pouvez pas faire cela avec un déclencheur de style pour définir l'image? Quel est le problème avec Uid et Tag? –

+0

@icebat oui, mais il n'est pas très efficace d'utiliser C#. – xSanciopanzax

Répondre

1

Essayez quelque chose comme ceci:

<Style x:Key="flatButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 

       <Border BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         Padding="{TemplateBinding Padding}"> 

        <ContentPresenter TextBlock.Foreground="{TemplateBinding Foreground}" 
             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="False"> 
         <!-- Setters to style disabled state --> 
        </Trigger> 

        <Trigger Property="IsPressed" Value="True"> 
         <!-- Setters to style pressed state --> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Vous devez appliquer votre propre style et il y a une possibilité que vous devrez changer IsPressed toucher propeties liés, mais cela devrait faire l'affaire. Pas besoin de logique personnalisée dans le code C#.

+0

J'essaie avec ceci: 'c

+0

Je n'ai pas développé d'application sur les écrans tactiles, mais je pense que IsPressed est suffisant dans ce cas, puisque le fait de toucher le bouton le pousse. Je ne comprends pas vraiment comment vous avez utilisé mon exemple, mais gardez à l'esprit que lorsque vous définissez un modèle, la balise ControlTemplate est obligatoire. Pouvez-vous éditer votre question et coller du code formaté pour montrer comment avez-vous implémenté ma solution? De même, vous n'avez pas besoin de créer de style pour chaque bouton. Il suffit de le créer dans votre Application.Resources ou dans un autre dictionnaire de ressources et de l'utiliser comme vous l'avez fait auparavant. –