2017-09-07 1 views
1

Ich habe ein Problem mit den Tasten in WPF.
Ich entwickle eine GUI mit vielen Seiten und relativen Schaltflächen (> 50).
Die GUI sollte mit einem Touchscreen-Display verwendet werden, so dass jede Taste nur zwei Grafikzustände hat und normal gedrückt wird (es gibt keinen deaktivierten Zustand), genau wie jede andere Taste in einer Smartphone-App.
Derzeit diese Lösung verwende ich hier:C# WPF - Probleme mit zwei Zustandsknöpfen. (Click Ereignis mit Touchscreen)

Resource File

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

In einer der Seite

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

Im Inneren des

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

Datei C# verwandt Diese Implementierung hat viele Probleme:

  • Ich kann nicht Uid und Tag benutzen

  • Langsame Reaktion, weil es hat eine C# Funktion 2 Mal pro Berührung müssen

  • ich die C# Funktion jedes Mal, wenn ich zu müssen kopieren laufen Verwenden Sie eine Schaltfläche in einer neuen Seite

  • Aber das eigentliche Problem ist, dass ich nicht weiß warum einige Zeit das ClickEvent nicht startet, wenn eine Taste gedrückt wird, und auf einem Computer funktioniert das ClickEvent nur für die ersten 3 ~ 5 mal als nur TouchDonw und TouchLeave funktionieren ...

(Ich verwende .NET 4.6.1 aber gleiches Verhalten mit 4.5.2 und 4.7)

Ich denke, bin möglich, die C# Komponente zu beseitigen und das Bild (Quelle) der Taste ändern nur mit XAML, aber ich suche nach einer Weile und ich kann nichts finden.

Kann mir bitte jemand helfen?

+1

Versuchen Sie, [ToggleButton] (https://msdn.microsoft.com/en-us/library/system.windows.controls.primitivs.togglebutton (v = vs.110) .aspx) zu emulieren? – icebat

+0

Sie können dies nicht mit einem Style-Auslöser tun, um das Bild einzustellen? Was ist das Problem mit Uid und Tag? –

+0

@icebat Ja, aber es ist nicht sehr effizient, C# zu verwenden. – xSanciopanzax

Antwort

1

so etwas wie dieses Versuchen:

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

Sie haben Ihr eigenes Styling anwenden und es gibt eine Möglichkeit, dass Sie IsPressed ändern müssen im Zusammenhang propeties zu berühren, aber den Trick tun sollten. Keine benutzerdefinierte Logik im C# -Code erforderlich.

+0

Ich versuche, mit diesem: 'c ' ' Es funktioniert nicht mit der Maus und es gibt nichts wie "IsTouchDown" oder "IsTouchedLeave". Und auch so muss ich für jeden Knopf einen Stil erstellen. – xSanciopanzax

+0

Ich habe keine App auf Touchscreens entwickelt, aber ich denke, IsPressed ist in diesem Fall genug, da das Berühren von Button es drückt. Ich verstehe nicht wirklich, wie Sie mein Beispiel benutzt haben, aber bedenken Sie bitte, dass das ControlTemplate-Tag beim Festlegen der Vorlage obligatorisch ist. Können Sie Ihre Frage bearbeiten und formatierten Code einfügen, um zu zeigen, wie Sie meine Lösung implementiert haben? Sie müssen auch nicht für jede Schaltfläche Stil erstellen. Erstellen Sie es einfach in Ihrem Application.Resources oder einem anderen Ressourcenwörterbuch und verwenden Sie es genauso wie zuvor. –