zoukankan      html  css  js  c++  java
  • Win10 UI入门 SliderRectangle

    看了@段博琼大哥导航滑动的思路,自己又做了一个类似与黄油相机里面的一个功能

                    <Grid x:Name="SliderGrid" Grid.ColumnSpan="2" Grid.Row="7">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <ContentPresenter x:Name="LeftContentPresenter" 
                                HorizontalAlignment="Center" Tapped="LeftContentPresenter_Tapped"
                                VerticalAlignment="Center">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <TextBlock Text="1111111111" FontSize="20" Margin="0,0,0,10"/>
                                <Rectangle x:Name="LeftRectStateName" Fill="Red" Height="2" 
                                                       HorizontalAlignment="Stretch" Grid.Row="1">
                                    <Rectangle.RenderTransform>
                                        <CompositeTransform/>
                                    </Rectangle.RenderTransform>
                                </Rectangle>
                            </Grid>
                        </ContentPresenter>
                        <ContentPresenter x:Name="RightContentPresenter" 
                                                        Grid.Column="1" 
                                                        Tapped="RightContentPresenter_Tapped"
                                                        HorizontalAlignment="Center" 
                                                        VerticalAlignment="Center">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <TextBlock Text="2222222222" FontSize="20" Margin="0,0,0,10"/>
                                <Rectangle x:Name="RightRectStateName" Fill="Red" Height="2" Opacity="0"
                                                       HorizontalAlignment="Stretch" Grid.Row="1">
                                    <Rectangle.RenderTransform>
                                        <CompositeTransform/>
                                    </Rectangle.RenderTransform>
                                </Rectangle>
                            </Grid>
                        </ContentPresenter>
                    </Grid>
            private Rectangle rect_old; // 上一次选中的 Rectangle
            private Rectangle rect_current;// 当前选中的 Rectangle
            private Storyboard tempStoryboard;
            private void RightContentPresenter_Tapped(object sender, TappedRoutedEventArgs e)
            {
                rect_current = VisualTreeUtil.FindChildOfType<Rectangle>(RightContentPresenter) as Rectangle;
                rect_old = VisualTreeUtil.FindChildOfType<Rectangle>(LeftContentPresenter) as Rectangle;
    
                var new_rect = ElementUtil.GetBounds(rect_current, SliderGrid);
                var old_rect = ElementUtil.GetBounds(rect_old, SliderGrid);
                tempStoryboard = StoryBordImg(old_rect, new_rect, LeftContentPresenter, RightContentPresenter);
    
                tempStoryboard.Completed += (s1, e1) =>
                {
                    RightContentPresenter.IsHitTestVisible = false;
                    LeftContentPresenter.IsHitTestVisible = true;
                    rect_current.Opacity = 1;
                    rect_old.Opacity = 0;
                    tempStoryboard.Stop();
    
                    WYToastDialog dialog = new WYToastDialog();
                    dialog.ShowAsync("222");
                };
            }
            private void LeftContentPresenter_Tapped(object sender, TappedRoutedEventArgs e)
            {
                rect_current = VisualTreeUtil.FindChildOfType<Rectangle>(LeftContentPresenter) as Rectangle;
                rect_old= VisualTreeUtil.FindChildOfType<Rectangle>(RightContentPresenter) as Rectangle;
    
                var new_rect = ElementUtil.GetBounds(rect_current, SliderGrid);
                var old_rect = ElementUtil.GetBounds(rect_old, SliderGrid);
                tempStoryboard = StoryBordImg(old_rect, new_rect, RightContentPresenter, LeftContentPresenter);
    
                tempStoryboard.Completed += (s1, e1) =>
                {
                    LeftContentPresenter.IsHitTestVisible = false;
                    RightContentPresenter.IsHitTestVisible = true;
                    rect_current.Opacity = 1;
                    rect_old.Opacity = 0;
                    tempStoryboard.Stop();
    
                    WYToastDialog dialog = new WYToastDialog();
                    dialog.ShowAsync("111");
                };
            }
    
            private Storyboard StoryBordImg(Rect oldR,Rect newR,ContentPresenter oldP,ContentPresenter newP)
            {
                var sb = new Storyboard();
                if (rect_old != null && rect_current != null)
                {
                    var anim = new DoubleAnimationUsingKeyFrames();
                    Storyboard.SetTarget(anim, rect_old);
                    Storyboard.SetTargetProperty(anim, "(UIElement.RenderTransform).(CompositeTransform.TranslateX)");
    
                    EasingDoubleKeyFrame KeyFrame = new EasingDoubleKeyFrame();
                    KeyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
                    KeyFrame.Value = 0;
    
                    EasingDoubleKeyFrame KeyFrame2 = new EasingDoubleKeyFrame();
                    KeyFrame2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(350));
                    KeyFrame2.Value = 600;
    
                    QuarticEase easing = new QuarticEase();
                    easing.EasingMode = EasingMode.EaseOut;
                    easing.Ease(0.3);
                    KeyFrame2.EasingFunction = easing;
    
                    anim.KeyFrames.Add(KeyFrame);
                    anim.KeyFrames.Add(KeyFrame2);
                    anim.KeyFrames[1].Value = newR.X - oldR.X;
    
                    var anim2 = new DoubleAnimation();
                    anim2.To = rect_current.ActualWidth / oldR.Width;
                    System.Diagnostics.Debug.WriteLine("x :" + rect_current.ActualWidth / rect_old.ActualWidth);
                    anim2.Duration = TimeSpan.FromMilliseconds(100);
                    Storyboard.SetTarget(anim2, rect_old);
                    Storyboard.SetTargetProperty(anim2, "(UIElement.RenderTransform).(CompositeTransform.ScaleX)");
    
                    sb.Children.Add(anim);
                    sb.Children.Add(anim2);
                    sb.Begin();
                }
                return sb;
            }

    本文可以封装城一个独立的控件使用在自己的项目中

    欢迎大家访问我的个人博客:https://androllen.github.io/

    https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/ee230084

    https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/ee330302

    https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/system.windows.visualstategroup.transitions

  • 相关阅读:
    提示“Resource temporarily unavailable”的原因及解决办法
    TQ2440与西门子S7-200 PLC自由口通信实现过程中问题总结
    SQL与SQL Server
    JavaScript:事件对象Event和冒泡
    JavaScript动画:offset和匀速动画详解(含轮播图的实现)
    JavaScript基础:BOM的常见内置方法和内置对象
    JavaScript实现Tab栏切换
    JavaScript基础:DOM操作详解
    JavaScript语法基础:数组的常用方法详解
    JavaScript语法详解:if语句&for循环&函数
  • 原文地址:https://www.cnblogs.com/luquanmingren/p/6215829.html
Copyright © 2011-2022 走看看