Tôi đang cố gắng xây dựng nút ToggleSwitch của wpf, nhưng dường như không thể tìm thấy cách truy cập kiểu với mã phía sau. Ý tưởng là thay đổi đường viền và màu nền của các điều khiển, hiện diện bên trong window.resource.style. Cụ thể là "ToggleButton" và "thanh trượt". Tôi đã thử sử dụng FindName, nhưng điều đó không trả về bất cứ điều gì vì nó không phải là điều khiển (?). Tôi thực sự không phải là một chuyên gia về wpf hoặc xaml, nhưng trong powershell đôi khi người ta cần phải giải quyết các nhu cầu cụ thể và tôi đang ở đây. Bất kỳ trợ giúp sẽ được đánh giá cao.
[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
}
Chúc mừng.
Mẫu đầu ra mong muốn:
Mặc dù bạn có thể viết điều này trong ISE, nhưng đây không thực sự là một câu hỏi PS. Đó chỉ là một câu hỏi WPF. Câu hỏi này dường như có một số thông tin hữu ích: stackoverflow.com/questions/13170620/ trên
—
nhạc2myear
Gì ? Tôi thực sự sử dụng XamlPad. Cảm ơn nhưng các liên kết đã không giúp đỡ. Có lẽ tôi đã không nhận được câu hỏi của tôi đúng. Tôi có thể và có phần wpf / xaml hoạt động và tôi có thể thay đổi đường viền hoặc bất cứ thứ gì khác trong xaml. Vấn đề là tôi muốn có thể thay đổi đường viền hoặc màu nền "ToggleSwitch" từ powershell.
—
Marco Vaz
PowerShell chỉ chạy mã XAML / WPF. Đây sẽ là một khối mã XAML mà PowerShell chạy. Vì vậy, câu hỏi là: Bạn đang cố gắng thay đổi linh hoạt màu sắc của công tắc chuyển đổi này dựa trên các hành động khác trong tập lệnh rộng hơn hay bạn chỉ cần biết mã XAML để THIẾT LẬP các màu chuyển đổi để bắt đầu? Cá nhân, tôi đã sử dụng Visual Studio Community Edition để xây dựng các khối mã XAML của mình để đưa vào các tập lệnh PS và điều này có thể sẽ có các công cụ để cho bạn thấy những gì cần thay đổi bằng cách thay đổi bằng giao diện người dùng VS và quan sát kết quả thay đổi mã.
—
music2myear
Cũng có một cơ hội tốt bạn sẽ tìm thấy một đối tượng hiểu biết hơn về khía cạnh cụ thể này trên StackExchange trên trang web chị em lập trình của chúng tôi. Hãy cho chúng tôi biết nếu bạn muốn chúng tôi di chuyển cái này sang đó. Đừng đăng chéo câu hỏi cho mình.
—
music2myear
@ music2myear có, vui lòng làm như vậy và chuyển sang stackexchange. Tôi nghĩ rằng nó sẽ tốt hơn. chúc mừng
—
Marco Vaz