Powershell: ฉันจะเปลี่ยนสีเส้นขอบของสไตล์ wpf Window.Resource ได้อย่างไร


0

ฉันกำลังพยายามสร้างปุ่ม 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 ฉันคิดว่ามันจะดีกว่า ไชโย
มาร์โกวาซ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.