Frage

Also, der Wunsch, einfach, ein Hintergrund der Schaltfläche auf Lightgreen, Grün ändern, wenn sich der Mauszeiger schwebt über ihm und dunkelgrün, wenn sie gedrückt wird. Die folgende XAML ist mein erster Versuch:

<Window x:Class="ButtonMouseOver.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Button Background="LightGreen">
      Hello
      <Button.Style>
        <Style TargetType="Button">
          <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Setter Property = "Background" Value="Green"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
              <Setter Property = "Foreground" Value="DarkGreen"/>
            </Trigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
  </Grid>
</Window>

Aber leider das nicht funktioniert. Wir sind nur 1/3 der Weg zum Ziel. Ja, wird die Taste hellgrün, aber sobald man den Mauszeiger über sie oder drücken Sie es von Standard Aero Chrom für die jeweiligen Tastenzustände erhalten. Nicht aufgeben will, ich versuche, die folgende Ausschweifung:

...
    <Button xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
            Background="LightGreen">
      Hello
      <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
          <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" 
            x:Name="Chrome" Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" 
            RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"
            >
            <ContentPresenter Margin="{TemplateBinding Padding}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          RecognizesAccessKey="True"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
          </Microsoft_Windows_Themes:ButtonChrome>
        </ControlTemplate>
      </Button.Template>
      <Button.Style>
        <Style TargetType="Button">
          <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Setter Property = "Background" Value="Green"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
              <Setter Property = "Foreground" Value="DarkGreen"/>
            </Trigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
...

Jetzt müssen wir die Steuervorlage geworfen ganzen friggin dort aus angehoben Aero.NormalColor.xaml . Ach, das ändert sich nichts. Ich gehe dann über das Entfernen von zwei Attributen (RenderPressed und RenderMouseOver) aus dem Microsoft_Windows_Themes:ButtonChrome Elemente. Noch gibt es keine Veränderung. Ich entferne dann die Einstellung der Background Attributs-Schaltfläche, so dass nur die Namespace-Deklaration für die PresentationFramework.Aero assembly:

...
<Button xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
  Hello
...

Schließlich haben wir Fortschritte. Wir haben von 1/3 der Anforderungen zu 2/3 des Weges gegangen, mit IsMouseOver und IsPressed arbeiten, aber kein hellgrünen Hintergrund während der normalen Zustands der Schaltfläche (der nicht in die moused über oder gedrückt), da ich entfernt haben die Background-Eigenschaft von der Taste, die beiden anderen Staaten anzuwenden und sichtbar zu bekommen. Jetzt, nach dieser wahnsinnigen XAML uns die Lightgreen Hintergrund für den normalen Tastenzustand erhalten ausfällt, ich den Stil ändern, um die Hintergrundfarbe in dort zu werfen auch:

  <Button xmlns...
    <ControlTemplate...
    ...
    </ControlTemplate>
    <Button.Style> 
      <Style TargetType="Button">
        <!-- ##### Normal state button background added ##### -->
        <Setter Property="Background" Value="LightGreen" />
        <!-- ################################################ -->
        <Style.Triggers>
          <Trigger Property="IsMouseOver" Value="true">
            <Setter Property = "Background" Value="Green"/>
          </Trigger>
          <Trigger Property="IsPressed" Value="true">
            <Setter Property = "Background" Value="DarkGreen"/>
          </Trigger>
        </Style.Triggers>
      </Style>
    </Button.Style> 
  </Button>

Schließlich, es funktioniert wie vorgesehen.

Bin ich verrückt, oder sind diese (und mehr) die Reifen Sie haben mit einem Aero-Design zu durchlaufen, um nur eine Hintergrundfarbe in einigen seiner verschiedenen Zustände der Schaltfläche ändern (normal, über schwebte, gepresst)? Vielleicht wäre das Leben nicht so schlimm, wenn ich nicht die ganze dingt ButtonTemplate dort aufzunehmen habe einfach die beiden Attribute (RenderMouseOver und RenderPressed) von ihm zu entfernen.

Vielen Dank für jede Hilfe - Ich bin auf Latein am Ende

.

Update: Aber warten Sie es mehr zu diesem. Statt die RenderMouseOver zu entfernen und RenderPressed Attribute von der Steuervorlage, einfach aus zu ändern:

<Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" ...
  RenderMouseOver="{TemplateBinding IsMouseOver}"  
  RenderPressed="{TemplateBinding IsPressed}" ...

zu:

<Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" ...
  RenderMouseOver="{Binding IsMouseOver}"  
  RenderPressed="{Binding IsPressed}" ...

..., behebt auch das Problem (des Ignorierens der Stil Auslöser der Schaltfläche). Ich denke, die Wurzel des Problems ist, dass die Template-Bindungen bei der Kompilierung (aus Leistungsgründen) angewandt werden, während normale Bindungen zur Laufzeit angewandt werden. Aus diesem Grunde werden die Bindungen aus den Stil-Trigger aus den einzelnen Tasten nicht verwendet, wenn Attribute Vorlage Bindungen verwenden (das heißt, die IsMouseOver und von der Originalvorlage IsPressed verwendet stattdessen).

Having said alle der oben genannten, hier das kanonische Beispiel ist eine Schaltfläche Hintergrund in Aero für die Änderung während seiner ursprünglichen Steuervorlage zu halten:

<Window x:Class="ButtonMouseOver.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Button>
      Hello
      <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
          <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" 
            x:Name="Chrome" Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" 
            RenderMouseOver="{Binding IsMouseOver}" RenderPressed="{Binding IsPressed}"
            >
            <ContentPresenter Margin="{TemplateBinding Padding}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          RecognizesAccessKey="True"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
          </Microsoft_Windows_Themes:ButtonChrome>
        </ControlTemplate>
      </Button.Template>
      <Button.Style>
        <Style TargetType="Button">
          <Setter Property="Background" Value="LightGreen"/>
          <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Setter Property = "Background" Value="Green"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
              <Setter Property = "Foreground" Value="DarkGreen"/>
            </Trigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
  </Grid>
</Window>

Das ist natürlich davon aus, dass nur eine Taste ist so gestylt, sonst wird die Vorlage und Stil in einen Abschnitt Ressourcen irgendwo ausgezogen werden kann. Auch gibt es keinen Auslöser für den Standardzustand eines Knopfes, aber es ist leicht auf das obige Beispiel hinzugefügt (nicht zu vergessen die RenderDefaulted Attribute in der Steuerelementvorlage zu ändern, anstatt Template zu verwenden Binding).

Wenn jemand irgendwelche Vorschläge, wie auf Überschreiben die Template mit Bindung nur für die beiden Attribute in der Steuervorlage, die Notwendigkeit zu ändern, ohne dass die gesamte Chrom Definition aus dem aero XAML Großhandel zu wiederholen, ich ist ganz Ohr.

War es hilfreich?

Lösung

Die Standardvorlage für Button verwendet eine ButtonChrome, die eine eigene Zeichnung ausführt. Wenn Sie vollständig loszuwerden, das Standardaussehen erhalten möchten, müssen Sie Ihre eigene Vorlage definieren, ohne die ButtonChrome. Ich weiß, es klingt langweilig, aber man muss es nur einmal tun: Sie Ihre benutzerdefinierten Stil in einem Ressourcenverzeichnis setzen, und beziehen sich nur auf sie mit StaticResource. Beachten Sie, dass Sie auch den Stil auf alle Tasten in Ihrer Anwendung mithilfe von {x:Type Button} wie der Stil des Schlüssel (x:Key Attribut)

anwenden können
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top