ฉันกำลังพยายามสร้างปุ่ม wpf ToggleSwitch แต่ดูเหมือนว่าจะไม่สามารถค้นหาสไตล์ด้วยการใช้โค้ดด้านหลัง ความคิดคือการเปลี่ยนสีเส้นขอบและพื้นหลังของตัวควบคุมที่มีอยู่ภายใน window.resource.style คือ "ToggleButton" และ "slider" ฉันลองใช้ FindName แล้ว แต่นั่นไม่ส่งคืนสิ่งใดเพราะไม่ใช่ตัวควบคุม (?) ฉันไม่ได้เป็นผู้เชี่ยวชาญใน wpf หรือ xaml จริงๆ แต่ในบางครั้ง powerhell บางครั้งต้องตอบสนองความต้องการเฉพาะและที่นี่ฉัน ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม
[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="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="Orange" />
<Setter Property="BorderThickness" Value="1,1,1,1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate x:Name="ControlToggle" TargetType="{x:Type CheckBox}">
<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="{StaticResource OnUnchecking}" x:Name="OnUnchecking_BeginStoryboard"/>
</Trigger.ExitActions>
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource OnChecking}" x:Name="OnChecking_BeginStoryboard"/>
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<CheckBox HorizontalAlignment="Center" Style="{DynamicResource ToggleSwitch}" 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
}
ไชโย
ตัวอย่างผลลัพธ์ที่ต้องการ:
ในขณะที่คุณอาจจะเขียนสิ่งนี้ภายใน ISE มันไม่ใช่คำถาม PS เป็นเพียงคำถาม WPF คำถามนี้ดูเหมือนว่าจะมีข้อมูลที่เป็นประโยชน์: stackoverflow.com/questions/13170620/…
—
music2myear
อะไร ? ฉันใช้ XamlPad จริง ๆ ขอบคุณ แต่ลิงค์ไม่ได้ช่วย บางทีฉันอาจไม่ได้รับคำถามอย่างถูกต้อง ฉันสามารถและให้ส่วน wpf / xaml ทำงานได้และฉันสามารถเปลี่ยนเส้นขอบหรือสิ่งอื่นใดใน xaml ปัญหาคือฉันต้องการที่จะสามารถเปลี่ยนเส้นขอบ "ToggleSwitch" หรือสีพื้นหลังจาก PowerShell
—
Marco Vaz
PowerShell เพียงเรียกใช้รหัส XAML / WPF มันจะเป็นบล็อครหัส XAML ที่ PowerShell ทำงาน ดังนั้นคำถามคือ: คุณพยายามเปลี่ยนสีของสวิตช์สลับนี้ตามการกระทำอื่น ๆ ในสคริปต์ที่กว้างขึ้นหรือคุณแค่ต้องรู้รหัส XAML สำหรับการตั้งค่าสีสลับเริ่มต้นด้วย? โดยส่วนตัวแล้วฉันใช้ Visual Studio Community Edition เพื่อสร้างบล็อคโค้ด XAML ของฉันเพื่อรวมไว้ในสคริปต์ PS และสิ่งนี้จะมีเครื่องมือในการแสดงสิ่งที่จำเป็นต้องเปลี่ยนโดยทำการเปลี่ยนแปลงโดยใช้ VS UI และสังเกตผลลัพธ์ การเปลี่ยนแปลงรหัส
—
music2myear
นอกจากนี้ยังมีโอกาสที่ดีที่คุณจะพบว่าผู้ชมมีความรู้มากขึ้นเกี่ยวกับลักษณะเฉพาะนี้ในการเขียนโปรแกรม StackExchange ในเครือของเรา แจ้งให้เราทราบหากคุณต้องการให้เราย้ายข้อมูลตรงนี้ อย่าโพสต์คำถามด้วยตัวเอง
—
music2myear
@ music2myear ใช่โปรดทำเช่นนั้นและย้ายไปที่ stackexchange ฉันคิดว่ามันจะดีกว่า ไชโย
—
มาร์โกวาซ