Powershell: Wie kann ich die Rahmenfarbe eines WF-Window.Resource-Stils ändern?

401
Marco Vaz

Ich versuche, eine ToggleSwitch-Schaltfläche zu erstellen, aber ich finde nicht, wie man auf den Stil mit hinterlegtem Code zugreifen kann. Die Idee ist, die Rahmen- und Hintergrundfarben der Steuerelemente in der window.resource.style zu ändern. Nämlich "ToggleButton" und "Slider". Ich habe versucht, FindName zu verwenden, aber es wird nichts zurückgegeben, da es kein Steuerelement (?) Ist. Ich bin wirklich kein Experte für WFP oder XAML, aber in Powershell muss man manchmal auf spezielle Bedürfnisse eingehen, und hier bin ich. Jede Hilfe wäre dankbar.

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework') $syncHash = [hashtable]::Synchronized(@{}) $newRunspace = [runspacefactory]::CreateRunspace()  $newRunspace.ApartmentState = "STA" $newRunspace.ThreadOptions = "ReuseThread"  $newRunspace.Open()  $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)  $psCmd = [PowerShell]::Create().AddScript({  [xml]$xaml = @"  <Window  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" x:Name="ToggleSwitch" Title="TogleSwitch..."  Width = "335" Height = "130" >  <Window.Resources> <Style x:Key="ToggleSwitch" TargetType=""> <Setter Property="Foreground" Value="}"/> <Setter Property="Background" Value="}"/> <Setter Property="BorderBrush" Value="Orange" /> <Setter Property="BorderThickness" Value="1,1,1,1" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate x:Name="ControlToggle" TargetType=""> <ControlTemplate.Resources> <Storyboard x:Key="OnChecking"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="45"/> </DoubleAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="OnUnchecking"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/> </DoubleAnimationUsingKeyFrames> <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(FrameworkElement.Margin)"> <SplineThicknessKeyFrame KeyTime="00:00:00.3000000" Value="1,1,1,1"/> </ThicknessAnimationUsingKeyFrames> </Storyboard> </ControlTemplate.Resources>  <DockPanel x:Name="dockPanel"> <Border x:Name="ToggleButton" Background="LightGray" BorderBrush="Gray" BorderThickness="2,2,2,2" CornerRadius="14,14,14,14" Height="30" Width="70" Margin="0,0,0,0"> <Grid Margin="0,0,0,0" Width="60" Height="25" Background="Transparent" > <Border x:Name="slider" Background="Gray" BorderBrush="White" HorizontalAlignment="Left" Width="15" Height="15" BorderThickness="0,0,0,0" CornerRadius="30,30,30,30" RenderTransformOrigin="0.5,0.5" Margin="0,0,0,0"> <Border.RenderTransform> <TransformGroup> <ScaleTransform ScaleX="1" ScaleY="1"/> <SkewTransform AngleX="0" AngleY="0"/> <RotateTransform Angle="0"/> <TranslateTransform X="0" Y="0"/> </TransformGroup> </Border.RenderTransform> </Border> </Grid> </Border> </DockPanel> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Trigger.ExitActions> <BeginStoryboard Storyboard="" x:Name="OnUnchecking_BeginStoryboard"/> </Trigger.ExitActions> <Trigger.EnterActions> <BeginStoryboard Storyboard="" x:Name="OnChecking_BeginStoryboard"/> </Trigger.EnterActions> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid>  <CheckBox HorizontalAlignment="Center" Style="" VerticalAlignment="Top" Width="200" Height="30" Margin="0,5,0,0"/> </Grid>  </Window>  $psCmd.Runspace = $newRunspace  $data = $psCmd.BeginInvoke()  While (!($syncHash.Window.IsInitialized)) {  Start-Sleep -S 1  }  

Prost.

Probe gewünschte Ausgabe:

Gewünschte Ausgabe

0
Auch wenn Sie dies in der ISE schreiben, handelt es sich eigentlich nicht um eine PS-Frage. Es ist nur eine WPF-Frage. Diese Frage dürfte einige hilfreiche Informationen enthalten: https://stackoverflow.com/questions/13170620/can-i-set-the-window-border-color-in-wpf music2myear vor 5 Jahren 0
Was? Ich benutze eigentlich XamlPad. Danke aber der Link hat nicht geholfen. Vielleicht habe ich meine Frage nicht richtig verstanden. Ich kann und habe den wpf / xaml-Teil funktionieren und ich kann die Grenze oder irgendetwas anderes in xaml ändern. Das Problem ist, dass ich die ToggleSwitch-Rahmen- oder Hintergrundfarbe von Powershell ändern kann. Marco Vaz vor 5 Jahren 0
PowerShell führt nur den XAML / WPF-Code aus. Es wird ein XAML-Codeblock sein, den PowerShell ausführt. Die Frage ist also: Versuchen Sie, die Farben dieses Umschalters basierend auf anderen Aktionen im umfassenderen Skript dynamisch zu ändern, oder müssen Sie nur den XAML-Code kennen, mit dem Sie die Umschaltfarben einstellen können? Ich persönlich habe die Visual Studio Community Edition verwendet, um meine XAML-Codeblöcke für die Aufnahme in PS-Skripts zu erstellen. Diese Tools verfügen wahrscheinlich über die Tools, die Ihnen zeigen, was geändert werden muss, indem Sie die Änderung mithilfe der VS-Benutzeroberfläche vornehmen und das Ergebnis beobachten Code ändert sich. music2myear vor 5 Jahren 0
Es besteht auch eine gute Chance, dass Sie ein Publikum mit mehr Informationen über diesen speziellen Aspekt auf unserer Programmierseite Stations-Site StackExchange finden. Lassen Sie uns wissen, ob Sie das hier migrieren möchten. Kreuzen Sie die Frage nicht selbst. music2myear vor 5 Jahren 0
@ music2myear ja, bitte mach das und migriere zu stackexchange. Ich denke es wäre besser. Prost Marco Vaz vor 5 Jahren 0

0 Antworten auf die Frage