WPF / C#:iPhone中的“滑动解锁”功能

时间:2011-03-24 09:19:36

标签: iphone wpf mocking

我只是想问一下你如何使用Windows Presentation Foundation从iPhone实现'Slide to Unlock'功能。

我已经看过这篇文章:iPhone slide to unlock progress bar (part 1),并想知道你是否可以给我一些其他资源以获得良好的开端。谢谢。

2 个答案:

答案 0 :(得分:7)

我会重新尝试滑块,因为这是最接近的控件,功能方面。

您应该捕获Value_Changed的事件,如果Value == Maximum,则滑块被“打开”。

重新设置控件会让它看起来像你的“解锁控件”。我稍后会粘贴一个例子。

- 编辑 - 有空闲时间在工作,所以我为你开始。 用法如下:

<Grid x:Name="LayoutRoot">
    <Slider Margin="185,193,145,199" Style="{DynamicResource SliderStyle1}"/>
</Grid>

和ResourceDictionary:

<ResourceDictionary
    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" mc:Ignorable="d">

    <LinearGradientBrush x:Key="MouseOverBrush" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFF" Offset="0.0"/>
        <GradientStop Color="#AAA" Offset="1.0"/>
    </LinearGradientBrush>


    <LinearGradientBrush x:Key="LightBrush" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFF" Offset="0.0"/>
        <GradientStop Color="#EEE" Offset="1.0"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="NormalBorderBrush" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#CCC" Offset="0.0"/>
        <GradientStop Color="#444" Offset="1.0"/>
    </LinearGradientBrush>

    <Style x:Key="SimpleScrollRepeatButtonStyle" d:IsControlPart="True" TargetType="{x:Type RepeatButton}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="IsTabStop" Value="false"/>
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type RepeatButton}">
                    <Grid>
                        <Rectangle Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <Style x:Key="ThumbStyle1" d:IsControlPart="True" TargetType="{x:Type Thumb}">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Grid Width="54">
                        <Ellipse x:Name="Ellipse" />
                        <Border CornerRadius="10" >
                            <Border.Background>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#FFFBFBFB" Offset="0.075"/>
                                    <GradientStop Color="Gainsboro" Offset="0.491"/>
                                    <GradientStop Color="#FFCECECE" Offset="0.509"/>
                                    <GradientStop Color="#FFA6A6A6" Offset="0.943"/>
                                </LinearGradientBrush>
                            </Border.Background>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Fill" Value="{StaticResource MouseOverBrush}" TargetName="Ellipse"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Fill" Value="{StaticResource DisabledBackgroundBrush}" TargetName="Ellipse"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="SliderStyle1" TargetType="{x:Type Slider}">
        <Setter Property="Background" Value="{StaticResource LightBrush}"/>
        <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Slider}">
                    <Border CornerRadius="14" Padding="4">
                        <Border.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#FF252525" Offset="0"/>
                                <GradientStop Color="#FF5C5C5C" Offset="1"/>
                            </LinearGradientBrush>
                        </Border.Background>
                        <Grid x:Name="GridRoot">
                        <TextBlock Text="Slide to unlock" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        <!-- TickBar shows the ticks for Slider -->

                        <!-- The Track lays out the repeat buttons and thumb -->
                            <Track x:Name="PART_Track" Height="Auto">
                                <Track.Thumb>
                                    <Thumb Style="{StaticResource ThumbStyle1}"/>
                                </Track.Thumb>
                                <Track.IncreaseRepeatButton>
                                    <RepeatButton Style="{StaticResource SimpleScrollRepeatButtonStyle}" Command="Slider.IncreaseLarge" Background="Transparent"/>
                                </Track.IncreaseRepeatButton>
                                <Track.DecreaseRepeatButton>
                                    <RepeatButton Style="{StaticResource SimpleScrollRepeatButtonStyle}" Command="Slider.DecreaseLarge" d:IsHidden="True"/>
                                </Track.DecreaseRepeatButton>
                            </Track>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="TickPlacement" Value="TopLeft"/>
                        <Trigger Property="TickPlacement" Value="BottomRight"/>
                        <Trigger Property="TickPlacement" Value="Both"/>
                        <Trigger Property="IsEnabled" Value="false"/>

                        <!-- Use a rotation to create a Vertical Slider form the default Horizontal -->
                        <Trigger Property="Orientation" Value="Vertical">
                            <Setter Property="LayoutTransform" TargetName="GridRoot">
                                <Setter.Value>
                                    <RotateTransform Angle="-90"/>
                                </Setter.Value>
                            </Setter>
                            <!-- Track rotates itself based on orientation so need to force it back -->
                            <Setter TargetName="PART_Track" Property="Orientation" Value="Horizontal"/>
                        </Trigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

请注意,这是一个非常好的开始,但并不是一切。 我还将定义一个自定义控件,该控件派生自滑块并自动使用此样式。当用户向右滑动时,我也会暴露一个SlideUnlocked事件。 为了完成所有这一切,我还会添加一个动画,将拇指向左移动,以防用户将其向右拖动,但不是一直向前(完全模仿iPhone的用户体验。)

祝你好运,如果你不知道如何实施我建议的任何阶段,请随时提出。

答案 1 :(得分:0)

WPF滑块有一个“ - ”,它是值,  总是当你移动它时,值是例如十进制1,122213174所以一个“ - ”。 但另一种创建滑块的方法是Windows窗体。

创建trackBar1,最多= 100个点。 这适用于Windows窗体应用程序: 在trackBar1_mouse_up上:

if(trackBar1.Value < 100) 
  { 
    //Animation - slide back dynamicaly.

   for(int i=0;i<=trackBar1.Value;i++){
      int secondVal=trackBar1.Value-i;
      trackBar1.Value=secondVal;
      System.Threading.Thread.Sleep(15);
   }
 }
 if(trackBar1.Value==100) 
 {
    //sets enabled to false, then after load cannot move it.
    trackBar1.Enabled=false;
    MessageBox.Show("Done!");
 }

这适用于WPF Slider :(在PreviewMouseUp上)

  if (Convert.ToInt16(slider1.Value) < 99)
        {
            //Animation - slide back dynamicaly.

            for (int i = 0; i < Convert.ToInt16(slider1.Value); i++)
            {
                int secondVal = Convert.ToInt32(slider1.Value) - i;
                slider1.Value = secondVal;
                System.Threading.Thread.Sleep(10);
                if (secondVal < 2)
                {
                    slider1.Value = 0;
                }
            }
        }
        if (Convert.ToInt16(slider1.Value) > 99)
        {
            //sets enabled to false, then after load cannot move it.
            slider1.IsEnabled = false;
            slider1.Value = 100;
            MessageBox.Show("Done!");
        }
祝你好运!我希望它有所帮助,尝试使用滑块,但我认为应用程序会崩溃。