2017-12-13 107 views
12

Tôi có một hộp kiểm thay thế một điều khiển giống như chuyển đổi.Tạm dừng/ngăn hoạt ảnh để kiểm soát hộp kiểm

enter image description here

enter image description here

Nó hoạt động tuyệt vời. Vấn đề duy nhất là chế độ ban đầu của hộp kiểm này có thể là true hoặc false. Đối với sai - không có vấn đề, nhưng nếu nó là sự thật, sau đó khi xem được tải, bạn ngay lập tức nhìn thấy các hình ảnh động của chuyển đổi di chuyển.

Tôi muốn ngăn chặn điều đó. Có anyway để làm như vậy?

Đây là XAML có liên quan:

<CheckBox Style="{StaticResource MySwitch}" IsChecked="{Binding ExplicitIncludeMode}" ></CheckBox> 

<Style x:Key="MySwitch" TargetType="{x:Type CheckBox}"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate 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="55"/> 
         </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"> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" RecognizesAccessKey="True" VerticalAlignment="Center"/> 
        <Border BorderBrush="LightGray" BorderThickness="1" Margin="5,5,0,5"> 
         <Grid Width="110" Background="GhostWhite"> 
          <TextBlock Text="Included" TextWrapping="Wrap" FontWeight="Medium" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,3,0" Foreground="#FF00AFC4"/> 
          <TextBlock HorizontalAlignment="Left" Margin="2,0,0,0" FontSize="12" FontWeight="Bold" Text="Excluded" VerticalAlignment="Center" TextWrapping="Wrap" Foreground="#FFE4424D"/> 
          <Border HorizontalAlignment="Left" x:Name="slider" Width="55" BorderThickness="1,1,1,1" CornerRadius="3,3,3,3" RenderTransformOrigin="0.5,0.5" Margin="1,1,1,1"> 
           <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.BorderBrush> 
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
             <GradientStop Color="WhiteSmoke" Offset="0"/> 
             <GradientStop Color="#FFFFFFFF" Offset="1"/> 
            </LinearGradientBrush> 
           </Border.BorderBrush> 
           <Border.Background> 
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
             <GradientStop x:Name="grdColor" Color="#FF00AFC4" Offset="1"/> 
             <GradientStop Color="#092E3E" Offset="0"/> 
            </LinearGradientBrush> 
           </Border.Background> 
          </Border> 
         </Grid> 
        </Border> 
       </DockPanel> 

       <ControlTemplate.Triggers> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" Value="True"/> 
          <Condition Property="IsPressed" Value="True"/> 
         </MultiTrigger.Conditions> 

         <MultiTrigger.ExitActions> 
          <BeginStoryboard Storyboard="{StaticResource OnUnchecking}" x:Name="OnUnchecking_BeginStoryboard"/> 
         </MultiTrigger.ExitActions> 
         <MultiTrigger.EnterActions> 
          <BeginStoryboard Storyboard="{StaticResource OnChecking}" x:Name="OnChecking_BeginStoryboard"/> 
         </MultiTrigger.EnterActions> 
        </MultiTrigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Width" Value="118"></Setter> 
    <Setter Property="Height" Value="39"></Setter> 

</Style> 

Đây là cách tôi khởi điểm + viewmodel:

// ctor of view (tab) 
public MonitoredExtensions() 
{ 
    InitializeComponent(); 
    DataContext = new MonitoredExtensionsViewModel(); 
} 

// ctor of viewmodel 
public MonitoredExtensionsViewModel() 
{ 
    ... 
    ExplicitIncludeMode = true/false; 
    ... 
} 
+0

Tôi không hoàn toàn tái tạo sự cố. Nếu tôi sao chép dán mã của bạn trong một WpfApp mới, nó luôn luôn hiển thị cùng một điều và không phản ứng theo cách nó nên (Nếu tôi hiểu một cách chính xác), sử dụng sai hoặc đúng sự thật. –

+0

@SimonMourier hmmm làm cách nào để bạn đặt trạng thái hộp kiểm đầu tiên? Bạn có làm điều đó trước khi InitializeComponent được gọi cho xem không? –

+0

Tôi đã cố gắng thiết lập IsChecked = true và false –

Trả lời

4

Tìm thấy 1 cách để làm điều này.

Hóa ra bạn có thể ràng buộc vị trí X ban đầu của nút chuyển/thanh trượt. Vì vậy, tôi đã liên kết nó với một thuộc tính trong ViewModel và cập nhật nó.

Changes để XAML:

<TranslateTransform X="{Binding InitialPosition}" Y="0"/> 

ctor của Xem:

public MonitoredExtensions() 
{ 
    InitializeComponent(); 
    DataContext = new MonitoredExtensionsViewModel(); 
} 

ctor của ViewModel:

public MonitoredExtensionsViewModel() 
{ 
    ... 
    ExplicitIncludeMode = true/false; 
    InitialPosition = (ExplicitIncludeMode) ? 55 : 0; 
    ... 
} 

Thêm từ ViewModel:

public Double InitialPosition { get; set; } 

Vì vậy, khi chế độ xem được tải, chế độ xem sẽ được tạo và vị trí ban đầu/ban đầu của thanh trượt được tính theo trạng thái hộp kiểm.

Các vấn đề liên quan